Я собираюсь использовать 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();
и у меня нет возможности правильно остановить мою программу.
Итак, мои вопросы:
RequestAbort()
также является асинхронным (намек на это есть в названии). После звонка, вы должны позвонить pUpSearcher_->EndSearch()
; он вернет ISearchResult с ResultCode
равно orcAborted
если прерывание было успешным. затем Вы можете освободить свои ресурсы.
Я не совсем уверен, как CleanUp()
предполагается использовать, но эта страница кажется, подразумевает, что он предназначен для сценариев, которые имеют обратные вызовы, и которые вы не должны вызывать CleanUp()
из обратного вызова. Не уверен, где ваш код для отмены запуска.
Других решений пока нет …