Come scrivere bootstrap exe, che lancia msiexec.exe e poi attendere il suo completamento
-
28-10-2019 - |
Domanda
Sto cercando di installare il mio plugin ActiveX, confezionato in NSI in un file di cabina e ho riscontrato un problema.
Il registro è
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"
Penso che sia uguale a questo:
Voglio provare la soluzione che è suggerita lì, ma non ho idea di come farlo
Crea un piccolo bootstrap exe, che non fa altro che lanciare msiexec.exe e quindi attendere il suo completamento.
Qualcuno può fornire aiuto?
Grazie!!
Soluzione
Date un'occhiata al dotnetinstaller - Programma bootstrapper pre -scritto che fa molto più di quello di cui hai bisogno, ma può fare esattamente quello che stai chiedendo.
Altri suggerimenti
Ecco un semplice wrapper che chiama msiexec.exe per installare silenziosamente l'MSI passato nel parametro della prima riga di comando.
È scritto come un'applicazione di riga di comando C ++ visiva:
// 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;
}
Spero possa aiutare.