簡體   English   中英

MSI / WIX:如何(自行)更新正在運行的服務

[英]MSI/WIX: How to (self-)update a running service

我必須編寫一個自動更新服務,在我們的客戶端PC上更新我們公司的應用程序。 要更新的應用程序之一是更新程序本身。 我使用WIX創建的MSI包部署所有應用程序。

然后,該服務使用“msiexec.exe / q / i”進行掃描以啟動靜默安裝。

這適用於其他產品,但是當我想更新正在運行的服務時,該服務就是啟動調用安裝程序的過程的服務。 因此,我正在嘗試更新正在運行的進程。

我該怎么做? “分叉”安裝程序進程並退出服務? 使用一些聰明的Windows內置方法?

感謝您的投入,這是我想出的:

我正在使用具有MajorUpgrade支持的WIX安裝程序和ServiceInstall元素來安裝新服務。 這將導致MSI停止服務並升級安裝。

現在, 要從內部更新服務我需要異步啟動安裝程序,然后允許停止正在運行的服務。

基本上我們需要打電話:

msiexec /package path_to_msi /quiet

由於CreateProcess需要可執行文件的完整路徑,我使用SHGetKnownFolderPath來檢索系統上的SYSTEM32路徑

// note: FOLDERID_SystemX86 will return 32 bit version of system32 regardless of application type
PWSTR str = nullptr;
if (SHGetKnownFolderPath(FOLDERID_SystemX86, KF_FLAG_DEFAULT, NULL, &str) != S_OK)
  throw std::runtime_error("failed to retrieve FOLDERID_SystemX86");
std::string exe = ...path to msiexec...;
std::string options = " /package \"path_to_msi\" /quiet";

現在,我們開始這個過程:

// start process
STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));

if (!CreateProcess(exe.c_str(),        // application name
                 options.c_str(),      // Command line options
                 NULL,                 // Process handle not inheritable
                 NULL,                 // Thread handle not inheritable
                 FALSE,                // Set handle inheritance to FALSE
                 0,                    // No creation flags
                 NULL,                 // Use parent's environment block
                 NULL,                 // Use parent's starting directory 
                 &si,                  // Pointer to STARTUPINFO structure
                 &pi))                 // Pointer to PROCESS_INFORMATION structure
  throw std::runtime_error("CreateProcess failed");

我們已經完成了。

安裝程序現在將發出停止服務信號,確保正確處理!

將安裝新服務,並希望在幾秒鍾內恢復運行。

完成;-)

如果有人需要更多細節,請隨便提出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM