C++ 如何取消正在进行的ISearchFolderItemFactory查询

C++ 如何取消正在进行的ISearchFolderItemFactory查询,c++,windows,windows-shell,C++,Windows,Windows Shell,使用ISearchFolderItemFactory,我发现行pEnum->Next(1,&pChildItem,&ulFetched)在搜索下一个结果时可能会花费大量的时间。如果查询没有结果,并且搜索范围也没有索引,那么这尤其令人痛苦。有没有办法取消搜索,或者以更异步的方式获取搜索结果?为了简洁起见,我删除了错误处理和清理 ISearchFolderItemFactory* folderSearch = nullptr; hr = ::CoCreateInstance(CLSID_Search

使用ISearchFolderItemFactory,我发现行
pEnum->Next(1,&pChildItem,&ulFetched)在搜索下一个结果时可能会花费大量的时间。如果查询没有结果,并且搜索范围也没有索引,那么这尤其令人痛苦。有没有办法取消搜索,或者以更异步的方式获取搜索结果?为了简洁起见,我删除了错误处理和清理

ISearchFolderItemFactory* folderSearch = nullptr;
hr = ::CoCreateInstance(CLSID_SearchFolderItemFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&folderSearch));
if (FAILED(hr)) { ... }

hr = folderSearch->SetScope(scopedItemArray);
if (FAILED(hr)) { ... }

hr = folderSearch->SetCondition(pc);
if (FAILED(hr)) { ... }

IShellItem* shellItem = nullptr;
hr = folderSearch->GetShellItem(IID_PPV_ARGS(&shellItem));
if (FAILED(hr)) { ... }

IEnumShellItems* pEnum = nullptr;
hr = shellItem->BindToHandler(nullptr, BHID_EnumItems, IID_PPV_ARGS(&pEnum));
if (FAILED(hr)) { ... }

IShellItem* pChildItem = nullptr;
ULONG ulFetched = 0;
do {
    hr = pEnum->Next(1, &pChildItem, &ulFetched);
    if (FAILED(hr)) break;
    if (ulFetched != 0) {
        LPWSTR szChildName = nullptr;
        pChildItem->GetDisplayName(SIGDN_FILESYSPATH, &szChildName);
        wprintf(L"Obtained %s\n", szChildName);
        CoTaskMemFree(szChildName);
        pChildItem->Release();
    }
} while (hr != S_FALSE);

我也遇到过这种情况,而且从来没有找到一个干净的解决方案——这些接口的文档糟糕得令人无法忍受。最终,我将搜索移动到一个单独的进程,并在我想要中止时终止它。你是说进程,而不是线程,以便操作系统清理所使用的资源?这似乎是极端的,但谢谢,我会认为这是最后一招。令人沮丧的是,如果我将一个IShellItem传递到FileOpenDialog->SetFolder,我会看到它可以工作,所以我知道这是可能的,只是API的文档记录太差了。如果你找到更好的方法,我很想知道:)