我正在尝试安装我的ActiveX插件,在一个cab文件中打包在nsi中,并遇到了问题。
日志
Code Download Error: (hr = 80070005) Access is denied.
ERR: Run Setup Hook: Failed Error Code:(hr) = 80070005, processing: msiexec.exe /package "%EXTRACT_DIR%\TempR.msi"
我认为与此相同:
我想尝试那里建议的解决方案,但不知道如何
创建一个小的bootstrap EXE,其中 除了启动MSIEXEC.EXE之外别无其他 然后等待它的完成。
有人可以提供任何帮助吗?
谢谢!
答案 0 :(得分:1)
这是一个简单的包装器,它调用msiexec.exe来安静地安装第一个命令行参数中传递的msi。
它是作为Visual C ++命令行应用程序编写的:
// InstallMSI.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <Windows.h>
#include <string>
int wmain(int argc, wchar_t* argv[])
{
if(argc < 2) {
printf("Usage: installmsi.exe <full path to msi file>\n\n");
printf("Package will be installed using msiexec.exe with the /qn (quiet install) flags.\n");
return 1;
}
std::wstring args;
args = L"msiexec.exe /i \"";
args += argv[1];
args += L"\" /qn";
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if(!CreateProcess(NULL, (LPWSTR)args.c_str(),
NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi)) {
printf("CreateProcess failed (%d).\n", GetLastError());
return 2;
}
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
希望有所帮助。
答案 1 :(得分:0)
看看dotNetInstaller - 预先编写的引导程序,它可以提供比你需要的更多的程序,但可以完全按照你的要求做。