如何将bundle的有效负载路径传递给msi?

时间:2015-10-20 18:06:55

标签: installation wix installer bootstrapper burn

我正在使用wix / burn为某些MSI文件创建一个引导程序。 我用xml有效负载创建了标记:

<BootstrapperApplicationRef ...>
    <Payload Id="myXML" Compressed="yes" SourceFile="c:\my.xml" />
</BootstrapperApplicationRef>

问题:如何将此有效负载的路径传递给MsiPackage?

<MsiPackage ...>
    <MsiProperty Name="XMLFILE" Value="[what do I use?]" />
</MsiPackage>

我也有兴趣在将文件传递给msi之前编辑该文件。为此,我正在使用bafunctions.dll。但我不知道如何获得bafunctions.dll的有效载荷路径(c ++代码)。我尝试了GetModuleFileName()但它给了我原始的包路径,比如c:\ users \ alex \ desktop \ bundle.exe,而不是解压缩所有内容的临时文件夹。

1 个答案:

答案 0 :(得分:0)

我实际上找到了一种方法:

在bafunction.dll中,我们可以使用GetModuleFileName()来获取实际加载的dll的路径,而不是exe:

//define this in your compilation unit (cpp)
EXTERN_C IMAGE_DOS_HEADER __ImageBase;

然后编写一个函数来获取dll路径:

WCHAR   DllPath[MAX_PATH] = {0};
GetModuleFileNameW((HINSTANCE)&__ImageBase, DllPath, _countof(DllPath));

这将为您提供bafunctions.dll的完整路径,但其他有效负载位于同一文件夹中。所以这只是解析这个字符串的问题。

获得路径后,您可以创建自己的刻录变量,也可以在xml标记中引用。

hr = m_pEngine->SetVariableString(L"MyXmlPath", myxmlpath.c_str());
BalExitOnFailure(hr, "Failed to set variable MyXmlPath.");