Excel VBA:"运行时错误' 49':错误的DLL调用约定"调用C ++ DLL

时间:2014-07-04 17:42:41

标签: c++ excel vba excel-vba dll

我试图从Excel-VBA调用C ++ DLL。

我知道DLL函数正在执行,因为我插入了fputs()记录调用以跟踪执行,并且标记显示在我的日志文件中。问题是,每当DLL函数返回时,我都会得到错误49。

以下是VBA中的声明:

Private Declare Function InitMCR Lib "MCRBoilerplate.dll" Alias "?initMCR@@YGXXZ" ()

这是C ++中的声明

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

为什么我会收到此错误49行为,即使DLL调用似乎正在工作?

2 个答案:

答案 0 :(得分:2)

在VBA中,返回void的函数需要声明为Sub而不是Function

所以VBA中的声明应该是:

Private Declare Sub InitMCR Lib "MCRBoilerplate.dll" Alias "?initMCR@@YGXXZ" ()

请参阅MSDN page on VBA Declare statement

答案 1 :(得分:0)

快速说明:您的问题可能不是外部函数中的参数不匹配,或者是导入它的声明 - VBA中存在已知的编译器故障,引发错误49.

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

你并非完全无可指责 - 你可能在应该工作的返回类型(长填充一个Int,Variants几乎任何东西)中的参数不匹配 - 但是我从未听说有人通过更好的编码来消除持久的运行时错误49。您只需重新编译,或导出并重新导入模块。

最糟糕的是正版 Forty-Niner比调整它需要的难度大得多:触发错误消息的语句通常不会调用错误声明的外部功能。如果你很幸运,那就是退出子'来电者;有些时候,你可以追溯到糟糕的电话,它可以追溯到堆栈中;但是,有时候,它根本不是显而易见的,根本就没有确定性的调试策略。