2009-02-22 8 views
13

Wie Debuggen ich einen fehlerhaften DLL-Aufruf Konvention Fehler in MSAccess VBA-Code?Debuggen einer fehlerhaften DLL-Aufrufkonvention Fehler

Ich habe einige Änderungen an einer Funktion in einem Modul vorgenommen und dann den Fehler erhalten. Wie kann man es debuggen, um die Ursache zu finden?

Der Fehler tritt bei der Exit-Funktionsanweisung der Funktion auf.

+0

Sie rufen eine native Funktion auf, die mit der Anweisung "Declare" deklariert wurde, richtig? Können Sie die Erklärung und den Anruf mit uns teilen? –

+3

Ich habe es behoben ... alles, was ich tun musste, ist den Zugriff mit/decompile starten und dann neu kompilieren und der Fehler ging weg. – Malcolm

+0

Für Auflösungen zu diesem Fehler in Excel finden Sie in meinem Beitrag zu: [Runtime Error 49, Bad DLL-Aufrufkonvention] [1] [1]: http://stackoverflow.com/questions/15758834/runtime -error-49-bad-dll-calling-convention – pstraton

Antwort

18

Haben Sie Ihre Referenzen überprüft und dekompiliert?

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

Siehe auch:
http://www.granite.ab.ca/access/decompile.htm
VBScript Decompile


prüfen Referenzen im 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

Ich wünschte, ich hätte für diese Antwort mehr Upvotes für dich. – Andy

+0

Ich habe diesen Fehler bei einem Aufruf (und erneut bei der Rückkehr von der Funktion) zu einer Access-VBA-Funktion, die ich geschrieben habe - keine externe API-Funktion./decompile und rekompilieren haben den Trick gemacht. Ich vermute, dass eine Menge von Debugging (anstatt nur Ausführen) eine rekursive Funktion Access verwirrt, und/decompile bereinigt das Chaos. – SebTHU

0

ich dies in Excel nur habe und fragte, ob jemand es vorher bekommen haben . Meine Lösung bestand darin, die Verweise auf meine eigene DLL zu verschieben und auf '<Projekt> kompilieren' zu klicken.

21

Ich habe dies in Excel vorher ohne externe Referenzen gesehen. Es passierte, wie bei Ihrem Problem, bei einem Exit-Funktionsaufruf. Excel scheint keine Option/dispopile zu haben, aber ich habe es behoben, indem ich in einem meiner Klassenmodule eine Änderung vorgenommen, eine Kompilierung aus dem Menü Debug ausgeführt und dann die Änderung rückgängig gemacht habe. Ich vermute, dass eines meiner Klassenmodule aus irgendeinem Grund falsch kompiliert wurde, und Excel wird nicht neu kompiliert, wenn es nicht denkt, dass sich etwas geändert hat.

+9

Holy f * danke für das Posting, genaues Problem hatte ich. Ich habe einfach ein xxxx an der Spitze jedes Moduls platziert, dann: Debug, Kompiliere VBAProject (was ein xxxx hervorhebt) ... lösche das -> Debug, Kompiliere VBAProject ... wiederhole, bis keine Kompilierungsfehler mehr auftreten. – tbone

2

Ich habe diesen Fehler mit the .NET library for WinSCP von MS Access VBA erlebt und bearbeitet.

Was geschah, war:

  1. Eine Funktion UploadSomething zu einem SFTP-Server zu verbinden und eine Datei hat gut funktioniert das Hochladen.
  2. Innerhalb der Funktion UploadSomething geändert, um die "resume Unterstützung" Option mit diesem Code: myTransferOptions.ResumeSupport.State = TransferResumeSupportState.TransferResumeSupportState_Off

Nach dem Wechsel arbeitete der Code wie gewünscht. In dem Code , derUploadSomething aufgerufen wird, wurde Fehler 49 jedoch nach Abschluss der Funktion ausgelöst.

Der Fehler ist sowohl beim Durchlaufen des Codes mit dem Debugger als auch bei der Ausführung außerhalb des Debuggers aufgetreten. Das Projekt neu zu erstellen hat bei mir nicht funktioniert.

Was hat funktioniert, war dies:

  1. den Verweis auf die COM-Komponente entfernen
  2. Fügen Sie den Verweis auf die COM-Komponente
  3. Recompile
1

In Excel VBA, kann dies verursacht durch irgendeines einiger Probleme:

  1. Ein nicht übereinstimmender Parameter oder Rückgabewerttyp.
  2. Eine Objektmethode (z. B. AutoFit), die auf ein fehlerhaftes Objekt angewendet wurde, für das diese Methode nicht verfügbar ist.
  3. Ein Aufruf einer externen Bibliotheksfunktion.
  4. Gebrochene Bibliothek Referenzen

Für Beschlüsse zu diesen Ursachen finden Sie meinen Beitrag bei: Runtime Error 49, Bad DLL calling convention

0

Wir in einige Probleme mit VBA ausgeführt haben, wenn eine DLL kompiliert in Intel Fortran zu nennen versuchen. Es stellt sich heraus, dass Sie die Aufrufkonventionen zurück zu einem „C“ Zusammenhang mit dem Compiler-Flag Aufrufkonvention ausrichten müssen: cfv

Weitere Informationen hier auf den Intel website Einen weiteren nützlichen Thread auf dem gleiche Problem: Intel Fortran DLL <-> C