2009-02-22 41 views
13

¿Cómo se depura un error de convención de llamada DLL incorrecto en el código de VBA de MSAccess?Depurar un error de convención de llamada a DLL incorrecto

Realicé algunos cambios a una función en un módulo y luego obtuve el error. ¿Cómo se puede depurar para encontrar la causa?

El error se produce en la declaración de función de salida de la función.

+0

Está llamando a una función nativa declarada con la declaración "Declarar", ¿verdad? ¿Podría compartir tanto la declaración como la llamada con nosotros? –

+3

Lo arreglé ... todo lo que tenía que hacer era iniciar el acceso con/descompilar y luego recompilar y el error desapareció. – Malcolm

+0

de resoluciones a este error en Excel, ver mi post en: [Tiempo de ejecución error 49, Bad DLL convención de llamada] [1] [1]: http://stackoverflow.com/questions/15758834/runtime -error-49-bad-dll-calling-convention – pstraton

Respuesta

18

¿Ha comprobado sus referencias y decompilado?

"C:\Program Files\Microsoft Office\Office\MSACCESS.EXE" 
           "d:\My Documents\access\mayapp.mdb" /decompile 

Consulte también:
http://www.granite.ab.ca/access/decompile.htm
VBScript Decompile


Verifique las referencias en código

Dim ref As Reference 
Dim sMsg As String 

''Available since 2010 
If BrokenReference Then 
    For Each ref In References 
     ''Available since at least 2000 
     If ref.IsBroken Then 
      sMsg = sMsg & "Ref Name: " & ref.Name 
      'Also, if required 
      'sMsg = sMsg & vbCrLf & "Built In: " & ref.BuiltIn 
      'sMsg = sMsg & vbCrLf & "Full Path: " & ref.FullPath 
      'sMsg = sMsg & vbCrLf & "GUID: " & ref.Guid 
      'sMsg = sMsg & vbCrLf & "Kind: " & ref.Kind 
      'sMsg = sMsg & vbCrLf & "Major (version number): " & ref.Major 
      'sMsg = sMsg & vbCrLf & "Minor (version number): " & ref.Minor 
      sMsg = sMsg & vbCrLf & "=================================" & vbCrLf 
     End If 
    Next 
    MsgBox sMsg 
End If 
+1

Deseando que tuviera más votos ascendentes para ti por esta respuesta. – Andy

+0

Me encontré con este error en una llamada (y de nuevo al regresar de la función) a una función de Access VBA que había escrito, no una función de API externa./descompilar y recompilar hizo el truco. Sospecho que una gran cantidad de depuración (en lugar de simplemente ejecutar) una función recursiva tiene acceso confuso, y/descompilar limpiado el lío. – SebTHU

0

sólo tengo esto en Excel y se preguntó si alguien más ha conseguido previamente . Mi solución fue mover las referencias a mi propia DLL y hacer clic en 'Compilar <Proyecto>'.

21

Lo he visto antes en Excel sin referencias externas. Sucedió, como con su problema, en una llamada de Función de salida. Excel no parece tener una opción/decompilar, pero la solucioné al hacer un cambio en uno de mis módulos de clase, ejecutar una compilación desde el menú Depurar y luego deshacer el cambio. Sospecho que uno de los módulos de mi clase se compiló mal por algún motivo, y Excel no volverá a compilarse a menos que piense que algo ha cambiado.

+9

Holy f * gracias por publicar esto, el problema exacto que tuve. Acabo de colocar un xxxx en la parte superior de cada módulo, luego: Depurar, compilar VBAProject (que resaltará un xxxx) ... eliminar eso -> Depurar, compilar VBAProject ... repetir hasta que no haya más errores de compilación. – tbone

2

Experimenté y resolví este error usando the .NET library for WinSCP desde MS Access VBA.

lo que ocurrió fue:

  1. Una función UploadSomething para la conexión a un servidor SFTP y subir un archivo funcionó bien.
  2. Dentro de la función UploadSomething cambió la opción "apoyo hoja de vida" con este código: myTransferOptions.ResumeSupport.State = TransferResumeSupportState.TransferResumeSupportState_Off

Después del cambio, el código trabajó como se desee. Sin embargo, en el código que llamóUploadSomething, se produjo el Error 49 después de que la función había finalizado.

El error ocurrió tanto al recorrer el código usando el depurador como al ejecutar inmediatamente fuera del depurador. Volver a compilar el proyecto no funcionó para mí.

¿Qué trabajo hizo fue esto:

  1. eliminar la referencia al componente COM
  2. Añadir la referencia al componente COM
  3. recompilación
1

En Excel VBA, esto puede ser causado por cualquiera de varios problemas:

  1. Un parámetro o tipo de valor de retorno no coincide.
  2. Un método de objeto (como AutoFit) aplicado a un objeto erróneo variación para la que ese método no está disponible.
  3. Llamada a una función de biblioteca externa.
  4. referencias de biblioteca rotos

para aquellas resoluciones a estas causas, ver mi post en: Runtime Error 49, Bad DLL calling convention

0

Nos hemos encontrado con algunos problemas con VBA cuando se trata de llamar a una DLL compilada en Intel Fortran. Resulta que necesita alinear las convenciones de llamada de nuevo a un contexto "C" con la bandera compilador convención vocación: cfv

Más información aquí en la Intel website Otro hilo útil sobre el mismo problema: Intel Fortran DLL <-> C

Cuestiones relacionadas