从 C++ 运行 MsiExec.exe?视窗
Posted
技术标签:
【中文标题】从 C++ 运行 MsiExec.exe?视窗【英文标题】:Run MsiExec.exe from c++? Windows 【发布时间】:2019-01-29 05:45:07 【问题描述】:MsiExec.exe /X9BA100BF-B59D-4657-9530-891B6EE24E31;
我需要通过我的 cpp 项目在 main 中运行此命令。这是一个新版本的软件,需要在安装之前删除旧版本。我想使用应用程序注册表中的卸载字符串来执行此操作。有没有办法在cpp中做到这一点?我正在使用 Qt 5.5。谢谢。
【问题讨论】:
【参考方案1】:最简单的方法之一是使用system 函数。
即:
int result = system("MsiExec.exe /X9BA100BF-B59D-4657-9530-891B6EE24E31");
其他更多 Windows 特定方式涉及使用CreateProcess 或ShellExecute Windows Win32 API 函数。
【讨论】:
有没有办法通过在注册表中查找匹配的 DisplayName 来搜索卸载键?然后,如果您通过 DisplayName 找到 GUID,请像上面一样运行卸载字符串?【参考方案2】:有没有办法通过在注册表中查找匹配的 DisplayName 来搜索卸载键?然后,如果您通过 DisplayName 找到 GUID,是否像上面那样运行卸载字符串? – 加兰
当然有。您可以使用本机 Windows API 来操作注册表,或者如果您愿意,您可以使用一些现有的 C++ 包装器来围绕该 API。
我写了一个简单易用的Registry wrapper,它支持枚举注册表键。
我认为您可能会发现它对解决您的问题很有用。
#include <Registry.hpp>
using namespace m4x1m1l14n;
std::wstring GetProductCodeByDisplayName(const std::wstring& displayName)
std::wstring productCode;
auto key = Registry::LocalMachine->Open(L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall");
key->EnumerateSubKeys([&](const std::wstring& subKeyName) -> bool
auto subKey = key->Open(subKeyName);
if (subKey->HasValue(L"DisplayName"))
if (displayName == subKey->GetString(L"DisplayName"))
// Product found! Store product code
productCode = subKeyName;
// Return false to stop processing
return false;
// Return true to continue processing subkeys
return true;
);
return productCode;
int main()
try
auto productCode = GetProductCodeByDisplayName(L"VMware Workstation");
if (!productCode.empty())
// Uninstall package
catch (const std::exception& ex)
std::cout << ex.what() << std::endl;
return 0;
另外你应该知道,有些包不是通过它的包代码存储在 Uninstall 注册表项下,而是通过它们的名称存储,要卸载它们,你必须在特定子项中搜索 UninstallString 值并调用而是这个包。
【讨论】:
以上是关于从 C++ 运行 MsiExec.exe?视窗的主要内容,如果未能解决你的问题,请参考以下文章
自定义操作不起作用 msiexec /a - Visual Studio 安装项目
打开很多网页就出现msiexec.exe,说Microsoft Office 2003的啥东西安装,这个是怎么回事呀?怎么解决呢