WiX - 将参数传递给CustomAction(DLL)

gle*_*roo 5 parameters installer custom-action wix

我有一个旧的WiSE安装程序的DLL,我正在尝试使用WiX,所以我很确定DLL可以与基于MSI的安装程序一起使用.

这是我的定义:

<Binary Id="SetupDLL" SourceFile="../Tools/Setup.dll" />
<CustomAction Id="ReadConfigFiles" BinaryKey="SetupDLL" DllEntry="readConfigFiles" />
Run Code Online (Sandbox Code Playgroud)

和用法:

<Publish Dialog="InstallDirDlg" Control="Next" Event="DoAction" Value="ReadConfigFiles" Order="3">1</Publish>
Run Code Online (Sandbox Code Playgroud)

我的C++函数如下所示:

extern "C" UINT __stdcall ReadConfigFiles(MSIHANDLE hInstall, CHAR * szDirectory)
Run Code Online (Sandbox Code Playgroud)

我在哪里可以传递参数?

i_a*_*orf 5

您无法直接传递参数,因为为了使其工作,您的函数必须以恰当的足迹导出.当你调用readConfigFiles你的自定义动作DLL时,它应该有这样的足迹:

extern "C" UINT __stdcall readConfigFiles(MSIHANDLE hInstaller);
Run Code Online (Sandbox Code Playgroud)

您可以使用该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);
}
Run Code Online (Sandbox Code Playgroud)

然后确保在.wxs文件中设置属性:

<Property Id="YOUR-PROPERTY-NAME">your-property-value</Property>
Run Code Online (Sandbox Code Playgroud)

  • &cch_value是缓冲区长度(如果其他人想知道,我不得不挖掘一下来找出它;)还有一些更深入的例子,但是如果你不知道长度的话我发现了一个"技巧"使用bufferLen = 0调用MsiGetProperty时失败,因为没有足够的空间来存储值,但它也填充了bufferLen,需要多少空间来存储实际值.再次调用MsiGetProperty(确保使用+1分配value = TCHAR [bufferLen + 1]以为空​​终止符腾出空间)将返回实际值. (2认同)