获取" setup.exe"的路径从运行MSI包

时间:2017-03-20 18:53:02

标签: 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\testsetup.exe ===

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

2 个答案:

答案 0 :(得分:0)

假设您的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的公共安全属性,那么只需用命令行启动MSI,包括MYFOLDER = [路径名]

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

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

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

答案 1 :(得分:0)

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

  1. 引导程序调用{​​{3}}以确定其自己的路径。
  2. 引导程序调用{​​{3}},并将路径作为命令行参数传递。

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

相关问题