从 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.exe产品ID卸载[重复]

Command Msiexec Install

使用Powershell实现自动化安装/卸载程序

自定义操作不起作用 msiexec /a - Visual Studio 安装项目

MSIEXEC -Embedding

打开很多网页就出现msiexec.exe,说Microsoft Office 2003的啥东西安装,这个是怎么回事呀?怎么解决呢