是否可以从自定义操作中获取启动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 reference和installer functions。
答案 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:
答案 1 :(得分:0)
我们最终修改了bootstrapper setup.exe,以将其自身的路径传递给MSI软件包。
引导程序调用{{3}},并将路径作为命令行参数传递。
std::wstring cmdLine = L"BOOTSTRAPPER_PATH=\"" + executablePath + L"\"";
MsiInstallProduct( msiFilePath.c_str(), cmdLine.c_str() );
自定义操作调用GetModuleFileName
以读取BOOTSTRAPPER_PATH
的值。