【问题标题】:Get path of "setup.exe" from running MSI package从正在运行的 MSI 包中获取“setup.exe”的路径
【发布时间】:2017-03-20 18:53:02
【问题描述】:

是否可以从自定义操作中获取启动 MSI 安装的可执行包(也称为引导程序)的路径?

获取 DLL 的父进程的常规方法不起作用,因为自定义操作 DLL 是由“msiexec.exe”加载的,而不是由 bootstrapper.exe 加载的。 “msiexec.exe”的父进程是“services.exe”,所以也无济于事。

Msiexec.exe 似乎知道调用进程,因为它将这一行写入日志文件:

=== Verbose logging started: [blah...] Calling process: C:\temp\testsetup.exe ===

我找不到任何 API 来查询此信息。我查看了property referenceinstaller functions

【问题讨论】:

  • 您使用哪个工具来构建 setup.exe 和 MSI?大多数人都会这样做,但它们并不完全相同。
  • "setup.exe" 是一个用 C++ 编写的自定义应用程序,MSI 是通过python msilib 构建的。我无法修改它们中的任何一个,因为我只是提供了一个合并模块。我需要读取一些附加到“setup.exe”的数据。

标签: windows-installer custom-action


【解决方案1】:

假设您的 setup.exe 与您的 MSI 文件位于同一位置,SourceDir 属性会告诉您安装 MSI 的文件夹。 OriginalDatabase 属性告诉您 MSI 文件的完整路径。

https://msdn.microsoft.com/en-us/library/windows/desktop/aa371857(v=vs.85).aspx

如果 setup.exe 实际上从已知位置启动 MSI 文件,则它可能是其他标准属性之一,例如 TempFolder。但是没有理由不能将文件夹传递到 MSI 安装中。如果您在 MSI 中声明了一个名为(例如)MYFOLDER 的公共安全属性,那么只需使用包含 MYFOLDER=[path name] 的命令行启动 MSI

我假设您知道如何从自定义操作中获取属性值。

从可能被删除的临时位置安装 MSI 不是一个好主意。建议保持 MSI 可用,规则 31:

https://blogs.msdn.microsoft.com/windows_installer_team/2006/05/24/tao-of-the-windows-installer-part-3/

【讨论】:

  • 假设您的 setup.exe 与您的 MSI 文件位于同一位置 - 不幸的是,事实并非如此。 setup.exe 是一个自解压可执行文件,它将 MSI 文件解压到临时目录中。
【解决方案2】:

我们最终修改了引导程序 setup.exe 以将其自己的路径传递给 MSI 包。

  1. Bootstrapper 调用 GetModuleFileName 来确定自己的路径。
  2. Bootstrapper 调用 MsiInstallProduct,将路径作为命令行参数传递。

    std::wstring cmdLine = L"BOOTSTRAPPER_PATH=\"" + executablePath + L"\"";
    MsiInstallProduct( msiFilePath.c_str(), cmdLine.c_str() );
    
  3. 自定义操作调用MsiGetProperty 来读取BOOTSTRAPPER_PATH 的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 2021-04-10
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多