gpt4 book ai didi

windows - 微星/WIX : How to (self-)update a running service

转载 作者:可可西里 更新时间:2023-11-01 09:28:08 25 4
gpt4 key购买 nike

我必须编写一个自动更新服务来更新我们公司在客户端 PC 上的应用程序。要更新的应用程序之一是更新程序本身。我使用使用 WIX 创建的 MSI 包部署所有应用程序。

然后该服务使用“msiexec.exe/q/i”生成一个进程以开始静默安装。

这适用于其他产品,但当我想更新正在运行的服务时,该服务是启动调用安装程序的进程的服务。因此,我正在尝试更新正在运行的进程。

我该怎么做? “ fork ”安装程序进程并退出服务?使用一些聪明的 Windows 内置方法?

最佳答案

感谢您的意见,这是我想出的:

我正在使用具有 MajorUpgrade 支持和 ServiceInstall 元素的 WIX 安装程序来安装新服务。这将导致 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");

我们完成了。

安装程序现在将发出停止服务的信号,确保处理正确!

新服务将被安装并有望在几秒钟内恢复运行。

完成;-)

如果有人需要更多详细信息,请尽管询问。

关于windows - 微星/WIX : How to (self-)update a running service,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38955702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com