Windows installer 获取“的路径”;setup.exe“;从运行MSI包

Windows installer 获取“的路径”;setup.exe“;从运行MSI包,windows-installer,custom-action,Windows Installer,Custom Action,是否可以从自定义操作中获取启动MSI安装的可执行程序包(也称为引导程序)的路径 获取DLL父进程的常规方法无法工作,因为自定义操作DLL由“msiexec.exe”加载,而不是由bootstrapper.exe加载。“msiexec.exe”的父进程是“services.exe”,所以这也没有帮助 Msiexec.exe似乎知道调用进程,因为它将这一行写入日志文件: === Verbose logging started: [blah...] Calling process: C:\temp\t

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

获取DLL父进程的常规方法无法工作,因为自定义操作DLL由“msiexec.exe”加载,而不是由bootstrapper.exe加载。“msiexec.exe”的父进程是“services.exe”,所以这也没有帮助

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

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

但是,我找不到任何API来查询此信息。我查看并。

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

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

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

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


我们最终修改了bootstrapper setup.exe,将其自身的路径传递给MSI包

  • 引导程序调用以确定自己的路径
  • 引导程序调用,将路径作为命令行参数传递

    std::wstring cmdLine = L"BOOTSTRAPPER_PATH=\"" + executablePath + L"\"";
    MsiInstallProduct( msiFilePath.c_str(), cmdLine.c_str() );
    
  • 自定义操作调用以读取
    BOOTSTRAPPER\u PATH
    的值


  • 您使用哪个工具来构建setup.exe和MSI?大多数都会这样做,但它们并不完全相同。“Stuto.exe”是用C++编写的自定义应用程序,MSI是通过。我不能修改它们,因为我只是提供了一个合并模块。我需要读取附加到“setup.exe”的一些数据。假设setup.exe与MSI文件位于同一位置-很遗憾,它不是。setup.exe是一个自解压可执行文件,将MSI文件解压到临时目录中。