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

我正尝试从Excel-VBA中调用C ++ DLL。

我知道DLL函数正在执行,因为我插入了fputs()日志logging调用来跟踪执行和邮票显示在我的日志文件。 问题是,每当DLL函数返回,我得到错误49。

这是VBA中的声明:

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

这里是C ++中的声明

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

为什么我得到这个错误49行为,即使DLL调用似乎工作?

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

所以VBA中的声明应该是:

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

请参阅VBA声明语句上的MSDN页面

快速点:你的问题可能不是在你的外部函数或导入它的声明中的参数不匹配 – VBA中有一个已知的编译器故障,导致错误49。

'堆栈器pstraton的答案'Excel – 运行时错误49:错误的DLL调用约定'

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

最糟糕的是,一个真正的四十Ninerdebugging远比它所需要的要困难得多:触发错误信息的语句通常不是调用外部函数的错误声明。 如果你幸运的话,那就是来电者的“退出分组” 还有一些时间,这些东西可以追溯到糟糕的通话。 但有时根本不明显,根本没有确定性的debugging策略。