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

How to pass the path to a bundle's payload to an msi?

我正在使用 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,而不是解压所有内容的临时文件夹。

我居然找到了方法:

在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.");