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_ указатель? Благодарю.

1 ответ

Решение

В соответствии с предложениями @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 (см. Код выше), также я прикрепил скриншот:

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

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

Другие вопросы по тегам