在Installscript自定义操作中使用C ++ DLL

时间:2018-10-05 07:14:11

标签: c++ dll windows-installer installshield installscript

Hello Stackoverflow社区,

我在Installscript自定义操作中调用C ++ DLL时遇到问题。当我尝试使用参数调用DLL时出现问题。错误图片如下:

  1. 使用参数调用DLL

  2. 这些值,参数已在DLL中成功处理(这些值也已成功传输)

  3. 在DLL方法成功完成之后,没有传递任何返回值,但是安装失败,并出现错误1603。

但是,如果我调用不带参数的相同方法,那么一切都会正常进行。

传递哪些参数或传递多少参数无关紧要。只要传递一个参数,设置就会失败。

安装脚本:

prototype NUMBER DoSomeThing(HWND, STRING, INT);
prototype NUMBER MsiCppTest.DoSomethingInCpp(STRING, INT);
prototype NUMBER MsiCppTest.DoSomethingOtherInCpp();

function NUMBER DoSomething(hMSi, sText, nCount)
    STRING sSupportDir;
    NUMBER nSize, nResult, nValue;
begin
    nSize = 256;
    nValue = -1;
    MsiGetProperty(hMSi, "SUPPORTDIR", sSupportDir, nSize);
    nResult = UseDLL(sSupportDir ^ "MsiCppTest.dll");    
    if (nResult = 0) then
        //does not work:
        nValue = MsiCppTest.DoSomethingInCpp(sText, nCount);

        //would work:
        nValue = MsiCppTest.DoSomethingOtherInCpp();

        UnUseDLL(sSupportDir ^ "MsiCppTest.dll");
    endif;

    return nValue;
end; 

C ++ DLL:

int DoSomethingInCpp(LPCTSTR lpText, int nCount) {
    //The ToDo function is executed successfully with the correct values
    ToDo(lpText, nCount);
    //As soon as the function is completed, the setup is aborted
    return 123;
}

int DoSomethingOtherInCpp() {
    //would work
    ToDo();
    return 321;
}

有人有解决此问题的想法吗?

1 个答案:

答案 0 :(得分:0)

对于确切的症状和原因,我有些不满意,但是我怀疑这可能是WINAPI / stdcallcdecl的调用约定不匹配。尝试将WINAPISTDCALL(或__stdcall)添加到c ++函数声明中,或将cdecl添加到InstallScript原型中。