我将使用WUA API并以这种方式开始执行异步搜索:
CComPtr<SearchCallbackImpl> iscc_; <<-- Note you need to CreateInstance
CComPtr<ISearchJob> pUpJob_;
pUpJob_ = NULL;
pUpSearcher_->BeginSearch(
CComVariant(criteria.c_str()).bstrVal,
iscc_,
CComVariant(L"Scanning"),
&pUpJob_);
当我需要停止我的程序,但ISearchJob 尚未完成时,我使用此代码:
if (pUpJob_)
{
CComVariant isStopped;
pUpJob_->get_IsCompleted(&isStopped.boolVal);
if (isStopped.boolVal == VARIANT_FALSE)
{
if (SUCCEEDED(pUpJob_->RequestAbort()))
{
pUpJob_->CleanUp();
pUpJob_.Release();
}
}
}
通常这段代码有效,但有时会挂起pUpJob_->CleanUp();
,我无法正确停止我的程序。
所以我的问题是:
答案 0 :(得分:0)
RequestAbort()
也是异步的(提示名称中的提示)。打电话后,你应该拨打pUpSearcher_->EndSearch()
;如果中止成功,它将返回ResultCode
等于orcAborted
的ISearchResult。 然后您可以释放您的资源。
我不完全确定应该如何使用CleanUp()
,但this page似乎意味着它适用于具有回调功能的脚本,并且您使用了CleanUp()
。不应该在回调中呼叫{{1}}。不确定您的取消代码在哪里运行。