2009-02-22 14 views
13

Come si esegue il debug di un errore di convenzione di chiamata DLL errato nel codice VBA di MSAccess?Errore di convenzione di chiamata DLL errata

Ho apportato alcune modifiche a una funzione in un modulo e quindi ho ricevuto l'errore. Come si fa a debuggarlo per trovare la causa?

L'errore si verifica sull'istruzione della funzione Exit della funzione.

+0

Stai chiamando una funzione nativa dichiarata con l'istruzione "Dichiara", giusto? Potresti condividere sia la dichiarazione che la chiamata con noi? –

+3

L'ho risolto ... tutto quello che dovevo fare è avviare l'accesso con/decompilare e poi ricompilare e l'errore è andato via. – Malcolm

+0

Per soluzioni a questo errore in Excel, vedi il mio post in: [Errore di runtime 49, Bad DLL convenzione di chiamata] [1] [1]: http://stackoverflow.com/questions/15758834/runtime -error-49-bad-dll-calling-convention – pstraton

risposta

18

Hai controllato i tuoi riferimenti e decompilato?

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

Consulta anche:
http://www.granite.ab.ca/access/decompile.htm
VBScript Decompile


Controlla i riferimenti nel codice

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

Desiderio di avere più voti per voi per questa risposta. – Andy

+0

Mi sono imbattuto in questo errore in una chiamata (e di nuovo al ritorno dalla funzione) a una funzione VBA di accesso che avevo scritto, non in una funzione API esterna./decompilare e ricompilare ha fatto il trucco. Ho il sospetto che un sacco di debug (piuttosto che solo in esecuzione) una funzione ricorsiva ha confuso Access, e/decompile ripulito il pasticcio. – SebTHU

0

Ho appena avuto questo in Excel e si è chiesto se qualcun altro hanno ottenuto in precedenza . La mia soluzione era di spostare i riferimenti alla mia DLL e fare clic su "Compila <Progetto>".

21

Ho visto questo in Excel prima senza riferimenti esterni. È successo, come con il tuo problema, su una chiamata di funzione di uscita. Excel non sembra avere un'opzione di/decompilazione, ma l'ho risolto apportando una modifica in uno dei miei moduli di classe, eseguendo una compilation dal menu Debug e quindi annullando la modifica. Sospetto che uno dei miei moduli di classe sia stato compilato male per qualche motivo, e Excel non verrà ricompilato a meno che non pensi che qualcosa sia cambiato.

+9

Holy f *, grazie per aver postato questo, il problema esatto che ho avuto. Ho appena inserito una xxxx nella parte superiore di ogni modulo, quindi: Debug, Compile VBAProject (che metterà in risalto un xxxx) ... cancella quello -> Debug, Compila VBAProject ... ripeti fino a quando non compaiono più errori di compilazione. – tbone

2

Ho riscontrato e risolto questo errore utilizzando the .NET library for WinSCP da MS Access VBA.

Era successo:

  1. Una funzione UploadSomething per la connessione a un server SFTP e l'upload di un file ha funzionato bene.
  2. All'interno della funzione UploadSomething cambiato l'opzione "supporto riprendere" con questo codice: myTransferOptions.ResumeSupport.State = TransferResumeSupportState.TransferResumeSupportState_Off

Dopo la modifica, il codice lavorato come desiderato. Tuttavia, nel codice chiamatoUploadSomething, l'errore 49 è stato lanciato dopo che la funzione era terminata.

L'errore si verifica sia quando si passa attraverso il codice utilizzando il debugger che quando si esegue contemporaneamente all'esterno del debugger. La ricompilazione del progetto non ha funzionato per me.

Che lavoro ha fatto è stato questo:

  1. Rimuovere il riferimento al componente COM
  2. Aggiungere il riferimento al componente COM
  3. Ricompilate
1

In Excel VBA, questo può essere causato da uno dei numerosi problemi:

  1. Un parametro o una mancata corrispondenza del tipo valore di ritorno.
  2. Un metodo oggetto (ad esempio AutoFit) applicato a una variazione errata dell'oggetto per la quale tale metodo non è disponibile.
  3. Una chiamata a una funzione di libreria esterna.
  4. rotti riferimenti alla libreria

di risoluzione a queste cause, si veda il mio post a: Runtime Error 49, Bad DLL calling convention

0

Abbiamo eseguito in alcuni problemi con VBA quando si cerca di chiamare una DLL compilata in Intel Fortran. Si scopre che è necessario allineare le convenzioni di chiamata di nuovo ad un contesto "C" con il flag di compilazione convenzione di chiamata: CFV

Maggiori informazioni qui sul Intel website Un altro thread utili sullo stesso problema: Intel Fortran DLL <-> C

Problemi correlati