2010-01-25 253 views
5

我有一個基本的維克斯自定義操作: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

回答

7

您需要導出叫功能,因此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; 
    } 
3

由於更換你的代碼中提到here,克服的是混淆的唯一途徑__stdcall是使用:

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

這產生了第二ENTR y在DLL導出表中。

+2

另一種確保非損壞函數名稱的方法包含在DLL導出中,將其導出到DEF文件並將其添加到鏈接器屬性(鏈接器 - >輸入 - >模塊定義文件)。 – Pierre 2013-06-22 10:49:32