Как написать Bootstrap Exe, который запускает msiexec.exe, а затем дождаться его завершения

StackOverflow https://stackoverflow.com/questions/6355312

Вопрос

Я пытаюсь установить свой плагин ActiveX, упакованный в NSI в файле CAB, и столкнулся с проблемой.

Журнал

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"

Я думаю, что это то же самое, что и этот:

http://social.msdn.microsoft.com/forums/en-us/ieextensiondevelopment/thread/3d355fb6-8d6a-4177-98c2-a25665510727/

Я хочу попробовать решение, которое предлагается там, но понятия не имею, как

Создайте небольшую начальную загрузку, которая не делает ничего, кроме как запустить msiexec.exe, а затем дождаться его завершения.

Может кто -нибудь оказать помощь?

Спасибо!!

Это было полезно?

Решение

Взгляни на dotnetinstaller - Предварительная программа Bootstrapper, которая делает намного больше, чем вам нужно, но может сделать именно то, что вы спрашиваете.

Другие советы

Вот простая обертка, которая вызывает msiexec.exe, чтобы спокойно установить MSI, пройденную в первом параметре командной строки.

Он написан как приложение командной строки 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;
}

Надеюсь, это поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top