Запустить MsiExec.exe из C++? Windows

MsiExec.exe /X{9BA100BF-B59D-4657-9530-891B6EE24E31};

Мне нужно запустить эту команду через мой проект cpp в main. Это новая версия программы, которая должна удалить старую версию перед установкой. Я хочу сделать это, используя строку удаления из реестра приложения. Есть ли способ сделать это в cpp? Я использую Qt 5.5. Благодарю.

1 ответ

Одним из самых простых способов является использование системной функции.

То есть:

int result = system("MsiExec.exe /X{9BA100BF-B59D-4657-9530-891B6EE24E31}");

Другие, более специфичные для Windows способы включают использование функций API CreateProcess или ShellExecute Windows Win32.

Есть ли способ найти ключ удаления, найдя в реестре подходящее DisplayName? Затем, если вы найдете GUID по DisplayName, запустите строку удаления, как указано выше? - Р.Гарланд

Есть конечно. Вы можете использовать собственный API-интерфейс Windows для управления реестром или, если хотите, можете использовать некоторую существующую оболочку C++ вокруг этого API-интерфейса.

Я написал небольшую простую в использовании обертку реестра, которая поддерживает перечисление разделов реестра.

Я думаю, что вам может пригодиться решение вашей проблемы.

#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 в определенном подразделе и вместо этого вызвать этот пакет.

Другие вопросы по тегам