【问题标题】:How to pass the path to a bundle's payload to an msi?如何将包有效负载的路径传递给 msi?
【发布时间】:2015-10-20 18:06:54
【问题描述】:

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

【问题讨论】:

    标签: wix installation bootstrapper burn


    【解决方案1】:

    其实我找到了办法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      • 2014-06-29
      相关资源
      最近更新 更多