正确的方法来停止异步ISearchJob

时间:2016-10-13 10:23:29

标签: c++ winapi com updates wuapi

我将使用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();,我无法正确停止我的程序。

所以我的问题是:

  1. 停止asynchronous search job for updates的正确方法是什么?
  2. 我也误解了ISearchJob::CleanUpISearchJob::RequestAbort之间有什么区别,以及如何使用这种方法正确停止异步搜索?
  3. 这些方法应该一起使用还是单独使用?

1 个答案:

答案 0 :(得分:0)

RequestAbort()也是异步的(提示名称中的提示)。打电话后,你应该拨打pUpSearcher_->EndSearch();如果中止成功,它将返回ResultCode等于orcAborted的ISearchResult。 然后您可以释放您的资源。

我不完全确定应该如何使用CleanUp(),但this page似乎意味着它适用于具有回调功能的脚本,并且您使用了CleanUp()。不应该在回调中呼叫{{1}}。不确定您的取消代码在哪里运行。