C++ WIX C++;自定义操作

C++ WIX C++;自定义操作,c++,wix,custom-action,name-decoration,C++,Wix,Custom Action,Name Decoration,我有一个基本的WIX自定义操作: UINT __stdcall MyCustomAction(MSIHANDLE hInstaller) { DWORD dwSize=0; MsiGetProperty(hInstaller, TEXT("MyProperty"), TEXT(""), &dwSize); return ERROR_SUCCESS; } 添加到安

我有一个基本的WIX自定义操作:

        UINT __stdcall MyCustomAction(MSIHANDLE hInstaller)
        {   
            DWORD dwSize=0;
            MsiGetProperty(hInstaller, TEXT("MyProperty"), TEXT(""), &dwSize);
            return ERROR_SUCCESS;
        }
添加到安装程序:

   <CustomAction Id="CustomActionId" FileKey="CustomDll" DllEntry="MyCustomAction"/>
   <InstallExecuteSequence>
       <Custom Action="CustomActionId" Before="InstallFinalize" />
   </InstallExecuteSequence>

问题是,无论我做什么,句柄hInstaller都是无效的。我已将操作设置为提交、延迟、更改InstallExecute序列中的位置,hInstaller始终无效


任何帮助都将不胜感激。谢谢。

您需要导出被调用的函数,以便MSI可以使用未修饰的C样式名称调用它

用这个替换你的代码

    extern "C" _declspec(dllexport) UINT __stdcall MyCustomAction(MSIHANDLE hInstall);

    extern "C" UINT __stdcall MyCustomAction(MSIHANDLE hInstall)
    {   
        DWORD dwSize=0;
        MsiGetProperty(hInstaller, TEXT("MyProperty"), TEXT(""), &dwSize);
        return ERROR_SUCCESS;
    }
如前所述,克服stdcall损坏的唯一方法是使用:

#pragma注释(链接器,“/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff@@”)


这将在DLL导出表中创建第二个条目。

以何种方式无效?您是否从API调用中返回错误?如果我进行任何使用句柄的调用,函数将返回无效的\u句柄错误消息。忽略句柄,函数本身是否被正确调用?我相信函数被正确调用。无论如何,为了解决这个问题,我已经重写了设置和自定义dll(没有太多代码),现在它工作正常。另一种确保dll导出中包含未损坏的函数名的方法是将其导出到DEF文件中,并将其添加到链接器属性(链接器->输入->模块定义文件)。