WiX - 传递参数给自定义操作(DLL)

5

我得到了一个来自旧版WiSE安装程序的DLL,我正在尝试在WiX中使其工作,因此我相信这个DLL可以与基于MSI的安装程序一起使用。

以下是我的定义:

<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)

我应该在哪里传递参数?

1个回答

6

你不能直接传递参数,因为为了使这个工作起来,你的函数必须用正确的格式导出。当你在自定义操作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(确保分配value=TCHAR [bufferLen+1],+1是为了留出空间来放置空终止符),将返回实际值。 - glenneroo
1
是的,cch是微软的匈牙利命名法中代表“字符数”的缩写,而cb则代表“字节数”。 - i_am_jorf
是的,这是已记录的行为。Win32和Shell在遵循这种模式方面非常一致。 - i_am_jorf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接