首页 文章

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

提问于
浏览
5

我试图从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 回答

  • 2

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

    所以VBA中的声明应该是:

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

    MSDN page on VBA Declare statement

  • 0

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

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

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

    最糟糕的是,一个真正的Forty-Niner远比它需要的调试困难得多:触发错误消息的语句通常不是't a call to the misdeclared external function. If you'很幸运,它可以退出Sub -2687535_ s,你可以跟踪堆栈中的某些内容回到糟糕的电话;但是,有时候,根本就没有确定性的调试策略 .

相关问题