So schreiben Sie Bootstrap Exe, die msiexec.exe starten und dann auf die Fertigstellung warten
-
28-10-2019 - |
Frage
Ich versuche, mein ActiveX -Plugin zu installieren, in NSI in einer CAB -Datei verpackt und auf ein Problem gestoßen.
Das Protokoll ist
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"
Ich denke, das gleiche wie dieser:
Ich möchte die dort vorgeschlagene Lösung ausprobieren, aber keine Ahnung hat, wie es geht
Erstellen Sie eine kleine Bootstrap -Exe, die nur msiexec.exe startet, und warten Sie dann auf die Fertigstellung.
Kann jemand Hilfe liefern?
Vielen Dank!!
Lösung
Sich ansehen DotnetInstaller - vorgezogenes Bootstrapper -Programm, das viel mehr tut als das, was Sie brauchen, aber genau das tun können, was Sie fragen.
Andere Tipps
Hier ist ein einfacher Wrapper, der msiexec.exe aufruft, um den im ersten Befehlszeilenparameter übergebenen MSI leise zu installieren.
Es ist als visuelle C ++ - Befehlszeilenanwendung geschrieben:
// 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;
}
Ich hoffe, das hilft.