2014-07-04 11 views
5

Sto tentando di chiamare una DLL C++ da Excel-VBA.VBA di Excel: "Errore di run-time '49': Convenzione di chiamata DLL non valida" chiamata C++ dll

So che la funzione DLL viene eseguita mentre ho inserito fput() chiamate di registrazione per tracciare l'esecuzione e i timbri sono visualizzati nel mio file di registro. Il problema è che, ogni volta che la funzione ritorna DLL, ottengo l'errore 49.

Ecco la dichiarazione in VBA:

Private Declare Function InitMCR Lib "MCRBoilerplate.dll" Alias "[email protected]@YGXXZ"() 

e qui è la dichiarazione in C++

__declspec(dllexport) void __stdcall initMCR() { ... } 

Perché io sono ottenere questo comportamento Errore 49, anche se le chiamate DLL sembrano funzionare?

+0

OK, mi sembra di aver mal interpretato troppo presto la tua prima versione non essendo una domanda valida. Ora capisco, volevi fornire un altro Q & A dando la soluzione. Ti consiglierei di inserire la tua soluzione come risposta alla domanda. Puoi farlo qui, è valido e incoraggiato. –

+2

Considera la pubblicazione della soluzione come risposta – Niall

+0

@wgrant/OT Nota: non è necessario fare clic su "Salva" per ottenere il backup delle versioni intermedie delle modifiche qui (SO esegue il backup delle bozze mentre stai modificando dopo un determinato periodo di tempo). Non appena fai clic su "salva", pubblichi le tue cose e potresti ricevere commenti e critiche sulle tue cose non finite. Ci scusiamo per i primi voti di chiusura/chiusura, in generale siamo i benvenuti. Metti la tua soluzione come risposta, come suggerito, e inverserei anche entrambe le cose. –

risposta

2

In VBA, le funzioni che restituiscono void bisogno di essere dichiarate Sub invece di Function

Così la dichiarazione in VBA dovrebbe essere:

Private Declare Sub InitMCR Lib "MCRBoilerplate.dll" Alias "[email protected]@YGXXZ"() 

Vedi MSDN page on VBA Declare statement

0

Un punto rapido: il vostro il problema potrebbe non essere una mancata corrispondenza dei parametri nella funzione esterna, o nella dichiarazione che lo importa - c'è un noto errore del compilatore in VBA che genera l'errore 49.

'Stacker pstraton's answer to 'Excel - Runtime Error 49: Bad DLL calling convention'

Tu non sei completamente irreprensibile - probabilmente avete una mancata corrispondenza parametro con un tipo restituito che dovrebbe lavoro (Long popolano un Int, Varianti popolando qualsiasi cosa) nella funzione di chiamata - ma io non ho mai sentito parlare di qualcuno che bandisca un persistente Errore di Runtime 49 con una migliore codifica. Ricompilate, o esportate e reimportate i moduli.

La cosa peggiore è che una vera e propria Forty-Niner è molto più difficile di eseguire il debug di quello che deve essere: l'affermazione che fa scattare il messaggio di errore di solito non è una chiamata alla funzione esterna dichiarate erroneamente. Se sei fortunato, è il 'Exit Sub' del chiamante; e alcune volte è qualcosa di più in alto che puoi risalire alla cattiva chiamata; ma, a volte, non è affatto ovvio e non esiste affatto una strategia di debug deterministica.