我试图从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调用似乎正在工作?
答案 0 :(得分:2)
在VBA中,返回void
的函数需要声明为Sub
而不是Function
所以VBA中的声明应该是:
Private Declare Sub InitMCR Lib "MCRBoilerplate.dll" Alias "?initMCR@@YGXXZ" ()
答案 1 :(得分:0)
快速说明:您的问题可能不是外部函数中的参数不匹配,或者是导入它的声明 - VBA中存在已知的编译器故障,引发错误49.
'Stacker pstraton's answer to 'Excel - Runtime Error 49: Bad DLL calling convention'
你并非完全无可指责 - 你可能在应该工作的返回类型(长填充一个Int,Variants几乎任何东西)中的参数不匹配 - 但是我从未听说有人通过更好的编码来消除持久的运行时错误49。您只需重新编译,或导出并重新导入模块。
最糟糕的是正版 Forty-Niner比调整它需要的难度大得多:触发错误消息的语句通常不会调用错误声明的外部功能。如果你很幸运,那就是退出子'来电者;有些时候,你可以追溯到糟糕的电话,它可以追溯到堆栈中;但是,有时候,它根本不是显而易见的,根本就没有确定性的调试策略。