2011-06-15 71 views
1

我試圖安裝我的ActiveX插件,打包在nsi中的cab文件中,並遇到問題。如何編寫引導EXE,它啓動MSIEXEC.EXE,然後等待其完成

日誌是

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/

我想嘗試,建議有解決方案,但不知道如何

創建一個小bootstrap EXE,其中 什麼都不做,只是啓動MSIE XEC.EXE 然後等待其完成。

有人可以提供任何幫助嗎?

謝謝!

+0

爲什麼不能直接使用MSI呢?我的意思是用戶雙擊你的MSI文件,MSI部署它? – 2011-06-20 19:28:05

回答

0

看看dotNetInstaller - 預先編寫好的引導程序,它比你需要的功能多得多,但可以完全按照你的要求來做。

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; 
} 

希望有所幫助。

相關問題