WIX C++自定义操作

问题描述:

我有一个基本的维克斯自定义操作:WIX C++自定义操作

 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始终无效。

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

+0

以何种方式无效?您是否收到来自API调用的错误? – 2010-01-28 03:20:30

+0

如果我进行任何使用该句柄的调用,该函数将返回Invalid_Handle错误消息。 – 2010-01-28 18:08:20

+0

忽略句柄,函数本身被正确调用? – saschabeaumont 2010-02-02 04:37:06

您需要导出叫功能,因此MSI可以使用未修饰的空调风格名称

称之为本

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; 
    } 

由于更换你的代码中提到here,克服的是混淆的唯一途径__stdcall是使用:

#pragma comment(linker, "/EXPORT:[email protected]@@23mangledstuff#@@@@")

这产生了第二ENTR y在DLL导出表中。

+2

另一种确保非损坏函数名称的方法包含在DLL导出中,将其导出到DEF文件并将其添加到链接器属性(链接器 - >输入 - >模块定义文件)。 – Pierre 2013-06-22 10:49:32