2010-04-28 47 views
5

我從舊的WiSE安裝程序中獲得了一個DLL,我試圖在WiX中工作,所以我非常確定該DLL可以與基於MSI的安裝程序一起工作。WiX - 將參數傳遞給CustomAction(DLL)

這裏是我的定義:

<Binary Id="SetupDLL" SourceFile="../Tools/Setup.dll" /> 
<CustomAction Id="ReadConfigFiles" BinaryKey="SetupDLL" DllEntry="readConfigFiles" /> 

與用法:

<Publish Dialog="InstallDirDlg" Control="Next" Event="DoAction" Value="ReadConfigFiles" Order="3">1</Publish> 

我的C++函數如下:

extern "C" UINT __stdcall ReadConfigFiles(MSIHANDLE hInstall, CHAR * szDirectory) 

我究竟哪裏可以傳遞參數?

回答

5

您不能直接傳遞參數,因爲爲了使其工作,您的功能必須以正確的佔位面積導出。當您在您的自定義操作DLL調用readConfigFiles,它應該有一個這樣的足跡:

extern "C" UINT __stdcall readConfigFiles(MSIHANDLE hInstaller); 

可以使用hInstaller參數讀取來自MSI屬性。使用MsiGetProperty()

HRESULT GetProperty(MSIHANDLE hInstaller, LPCWSTR property, LPWSTR value, DWORD cch_value) { 
    UINT err = MsiGetProperty(hInstaller, property, value, &cch_value); 
    return (err == ERROR_SUCCESS ? S_OK : E_FAIL); 
} 

然後只是確保你設置的屬性在.wxs文件:

<Property Id="YOUR-PROPERTY-NAME">your-property-value</Property> 
+2

&cch_value是緩衝區的長度(如果別人想知道,我已經挖了一下,找到這個出來;) 還有一些更深入的例子,但是我發現如果你不知道長度是用bufferLen = 0調用MsiGetProperty,這會失敗,因爲沒有足夠的空間來存儲一個值,但它也填充bufferLen需要多少空間來存儲實際值。再次調用MsiGetProperty(確保使用+1分配value = TCHAR [bufferLen + 1]以騰出空終止符)將返回實際值。 – glenneroo 2010-05-10 14:46:51

+1

是的,cch是微軟的匈牙利符號「字符數」,而cb是「字節計數」。 – 2010-05-10 20:27:27

+0

是的,這是[記錄的行爲](https://msdn.microsoft.com/en-us/library/windows/desktop/aa370134(v = vs.85).aspx)。遵循這種模式,Win32和shell非常一致。 – 2016-04-28 03:11:59