Déboguer une erreur de convention d'appel de DLL incorrecte


13

Comment puis-je déboguer une erreur de convention d'appel de DLL incorrecte dans le code VBA MSAccess?

J'ai apporté quelques modifications à une fonction dans un module, puis j'ai reçu l'erreur. Comment faire un débogage pour trouver la cause?

L'erreur se produit dans l'instruction de fonction de sortie de la fonction.

  0

Vous appelez une fonction native déclarée avec l'instruction "Declare", n'est-ce pas? Pourriez-vous partager à la fois la déclaration et l'appel avec nous? 22 févr.. 092009-02-22 08:56:00

+3

Je l'ai corrigé ... tout ce que je devais faire est de démarrer l'accès avec/decompile puis de recompiler et l'erreur est partie. 22 févr.. 092009-02-22 11:55:54

  0

Pour les résolutions à cette erreur dans Excel, voir mon post à: [Erreur d'exécution 49, Bad convention d'appel DLL] [1] [1]: http://stackoverflow.com/questions/15758834/runtime -error-49-bad-dll-calling-convention 20 sept.. 142014-09-20 00:28:49

18

Avez-vous vérifié vos références et décompilé?

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

Voir aussi:
http://www.granite.ab.ca/access/decompile.htm
VBScript Decompile


Vérifiez les références dans le code

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

Souhaitant que j'avais plus de votes pour vous pour cette réponse. 15 avril. 112011-04-15 10:05:17

  0

J'ai couru dans cette erreur sur un appel (et encore sur le retour de la fonction) à une fonction Access VBA que j'avais écrit - pas une fonction API externe./décompiler et recompiler a fait l'affaire. Je soupçonne que beaucoup de débogage (plutôt que de simplement exécuter) une fonction récursive a rendu Access confus, et/decompile a nettoyé le désordre. 19 déc.. 152015-12-19 13:42:08


0

Je viens dans Excel et je me demandais si quelqu'un d'autre a obtenu préexistait . Ma solution consistait à déplacer les références à ma propre DLL et à cliquer sur 'Compiler <Project>'.


21

Je l'ai déjà vu dans Excel avant sans références externes. C'est arrivé, comme avec votre problème, sur un appel de fonction de sortie. Excel ne semble pas avoir d'option/decompile, mais je l'ai corrigé en modifiant l'un de mes modules de classe, en exécutant une compilation à partir du menu Déboguer, puis en annulant la modification. Je soupçonne que l'un de mes modules de classe a mal compilé pour une raison quelconque, et Excel ne recompilera pas à moins qu'il ne pense que quelque chose a changé.

+9

Saint f * merci de poster ceci, le problème exact que j'ai eu. Je viens de placer un xxxx en haut de chaque module, puis: Debug, Compile VBAProject (qui mettra en évidence un xxxx) ... supprime que -> Debug, Compile VBAProject ... répète jusqu'à ce qu'il n'y ait plus d'erreurs de compilation. 25 juin. 122012-06-25 23:18:49


2

J'ai rencontré et résolu cette erreur en utilisant the .NET library for WinSCP de MS Access VBA.

Qu'est-il arrivé était:

  1. Une fonction UploadSomething pour la connexion à un serveur SFTP et de télécharger un fichier a bien fonctionné.
  2. Dans la fonction UploadSomething a changé l'option "support CV" avec ce code: myTransferOptions.ResumeSupport.State = TransferResumeSupportState.TransferResumeSupportState_Off

Après le changement, le code a fonctionné comme souhaité. Cependant, dans le code appeléUploadSomething, l'erreur 49 a été levée une fois la fonction terminée.

L'erreur s'est produite à la fois lors de l'exécution du code à l'aide du débogueur et lors de l'exécution à la fois en dehors du débogueur. Recompiler le projet n'a pas fonctionné pour moi.

Qu'est-ce que le travail était le suivant:

  1. Retirez la référence au composant COM
  2. Ajouter la référence au composant COM
  3. recompilation

1

Dans Excel VBA, cela peut être causé par l'un des problèmes suivants:

  1. Un paramètre ou une incompatibilité de type valeur de retour.
  2. Une méthode d'objet (telle que AutoFit) appliquée à une variante d'objet erroné pour laquelle cette méthode n'est pas disponible.
  3. Un appel à une fonction de bibliothèque externe.
  4. références bibliothèque brisées

pour les résolutions à ces causes, voir mon post à: Runtime Error 49, Bad DLL calling convention


0

Nous avons rencontré quelques problèmes avec VBA lorsque vous essayez d'appeler une DLL compilée dans Intel Fortran. Il se avère que vous devez aligner les conventions d'appel de nouveau à un contexte « C » avec le drapeau du compilateur convention d'appel: CFV

Plus d'informations ici sur le Intel website Un autre fil utile sur le même problème: Intel Fortran DLL <-> C