IUpdateSearcher :: BeginSearch ошибка неверного указателя

Я собираюсь искать обновления с BeginSearch. ISearchCompletedCallback был реализован с помощью способа:

#pragma once

class ISCC : public ISearchCompletedCallback
{
public:
ISCC()
{ }
~ISCC()
{ }

public:
ULONG STDMETHODCALLTYPE ISCC::AddRef()
{
InterlockedIncrement(&refCounter_);
return refCounter_;
}
ULONG STDMETHODCALLTYPE Release()
{
ULONG ulRefCount = InterlockedDecrement(&refCounter_);
if (0 == refCounter_)
{
delete this;
}
return ulRefCount;
}
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, LPVOID *ppvObj)
{
if (!ppvObj)
return E_INVALIDARG;
*ppvObj = NULL;
if (riid == IID_IUnknown || riid == IID_ISearchCompletedCallback)
{
*ppvObj = (LPVOID)this;
AddRef();
return NOERROR;
}
return E_NOINTERFACE;
}
virtual HRESULT STDMETHODCALLTYPE Invoke(
ISearchJob *searchJob, ISearchCompletedCallbackArgs *callbackArgs)
{
std::cout << "Invoked" << std::endl;
return S_OK;
}

private:
long refCounter_;
};

Также я создал другой класс (Enumerator), где я поместил метод для запуска асинхронного поиска и некоторые частные члены-данные, которые мне нужно использовать в моей программе:

class Enumerator
{
public:
Enumerator() { }
~Enumerator() { }

public:
//! Begins execution of an asynchronous search for updates.
void AsynchSearch(const _tstring& criteria = _T("IsInstalled=0"))
{
CComPtr<IUpdateSession> pUpSession;
if (SUCCEEDED(CoCreateInstance(
CLSID_UpdateSession,
NULL,
CLSCTX_INPROC_SERVER,
IID_IUpdateSession,
(LPVOID*)&pUpSession)))
{
if (SUCCEEDED(pUpSession->CreateUpdateSearcher(&pUpSearcher_)))
{
HRESULT ret;
ret = pUpSearcher_->BeginSearch(
CComVariant(criteria.c_str()).bstrVal,
iscc_,
CComVariant(_T("Scanning")),
&pJob_);

if (FAILED(ret))
{
// I get next error in this place
// E_POINTER Invalid pointer. <<-- Error!!!

std::cout << "Error occured" << std::endl;
}
}
}
}

private:
//! Asynchronous search callback.
CComPtr<ISCC> iscc_;
//! Job pointer.
CComPtr<ISearchJob> pJob_;
//! Searcher pointer.
CComPtr<IUpdateSearcher> pUpSearcher_;
};

Моя проблема, что когда я использую метод BeginSearch я получаю ошибку «Неверный указатель» (см. метод Enumerator :: AsynchSearch). Выглядит как указатель CComPtr<ISCC> iscc_ был инициализирован неправильно. Каким образом я должен инициализировать CComPtr<ISCC> iscc_ указатель? Благодарю.

0

Решение

В соответствии с предложениями @ IInspectable, я изменил код следующим образом:

class ISCC : public CComObjectRootEx<CComMultiThreadModel>, ISearchCompletedCallback
{
public:
//! Constructor.
ISCC();
//! Destructor.
~ISCC();

public:
//! Handles the notification of the completion of an asynchronous search
virtual HRESULT STDMETHODCALLTYPE Invoke(
ISearchJob *searchJob, ISearchCompletedCallbackArgs *callbackArgs);
};

И теперь, когда я пытаюсь создать инстанс таким образом:

CComObject<ISCC>* iscc_ = NULL;
HRESULT res = CComObject<ISCC>::CreateInstance(&iscc_); // <<-- Error "Access violation"if (SUCCEEDED(res))
{
std::cout << "Created" << std::endl;
}

Я получаю ошибку Access Access (см. Код выше), также я прикрепил скриншот:

Ошибка нарушения доступа

Что я делаю неправильно? Благодарю.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]