SHGetKnownFolderItem-在Wow64上失败

时间:2019-03-04 15:12:40

标签: c++ windows api

我想获取已安装的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 :(得分:1)

一个空洞的声音低语:“ 64位子进程”。

说真的,您正在尝试制作OS维护工具,而又不将该工具与OS匹配。别这样无论如何,都将工具的位数与操作系统的位数相匹配。

没有规则规定32位进程不能启动64位进程。