SHGetKnownFolderItem - не работает на Wow64 - PullRequest
0 голосов
/ 04 марта 2019

Я хочу получить список установленных обновлений Windows.

Я компилирую 32-битный исполняемый файл и запускаю его на 64-битной машине (Windows 10)

Я вызываю функцию SHGetKnownFolderItemчтобы получить известную папку FOLDERID_AppUpdates, однако я получаю E_INVALIDARG

В x64 все работает нормально.У меня есть ограничение для его компиляции в 32-битном формате.

Я выбрал этот вариант, потому что он был самым быстрым.

Код:

void ViewInstalledUpdates()
{
using namespace std;
HRESULT hr = CoInitialize(NULL);
int count = 0;

if (SUCCEEDED(hr))
{
    CComPtr<IShellItem> pUpdates;
    CComPtr<IEnumShellItems> pShellEnum;

    hr = SHGetKnownFolderItem(FOLDERID_AppUpdates, static_cast<KNOWN_FOLDER_FLAG>(0), nullptr, IID_PPV_ARGS(&pUpdates));
    hr = pUpdates->BindToHandler(nullptr, BHID_EnumItems, IID_PPV_ARGS(&pShellEnum));
    if (pShellEnum)
    {
        do {
            CComPtr<IShellItem> pItem;
            CComHeapPtr<WCHAR> szName;

            hr = pShellEnum->Next(1, &pItem, nullptr);
            if (pItem)
            {
                HRESULT hres = pItem->GetDisplayName(SIGDN_NORMALDISPLAY, &szName);
                std::wcout << static_cast<LPWSTR>(szName) << endl;
                count++;
            }
        } while (hr == S_OK);
    }
}
CoUninitialize();
std::wcout << L"Found " << count << " updates" << endl;
return;

}

Есть идеи?

Спасибо!

1 Ответ

0 голосов
/ 04 марта 2019

Полым голосом прошептал: «64-битный дочерний процесс».

На полном серьезе мы пытаемся создать инструмент для обслуживания ОС, не сопоставляя его с ОС.Не делай этого, мужик.Сопоставьте разрядность инструмента с разрядностью ОС, несмотря ни на что.

Не существует правила, согласно которому 32-разрядные процессы не могут запускать 64-разрядные процессы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...