首页 > 解决方案 > C++ ATL | _InternalQueryInterface 标识符未找到

问题描述

我有以下课程

class SearchCompleteFunction : public ISearchCompletedCallback
    {

    public:

        SearchCompleteFunction()
        { }
        ~SearchCompleteFunction()
        { }

        virtual HRESULT STDMETHODCALLTYPE Invoke( ISearchJob *searchJob, ISearchCompletedCallbackArgs *callbackArgs )
        {
            std::cout << "Invoked" << std::endl;
            return S_OK;
        }
    };

// Now I am trying to BeginSearch
    {
        CComObject<SearchCompleteFunction>* searchCompleteFunc = nullptr;
        HRESULT hres = CComObject<SearchCompleteFunction>::CreateInstance( &searchCompleteFunc );
        CComPtr<ISearchJob> searchJob = nullptr;

        hr = ptrUpdateSearcher->BeginSearch(_bstr_t(bstrCriteria.c_str()), searchCompleteFunc, CComVariant(L"Scanning"), &searchJob);
    }

当我编译这段代码时,我得到 '_InternalQueryInterface': identifier not found。

我也用过

BEGIN_COM_MAP( SearchCompleteFunction )
    COM_INTERFACE_ENTRY( ISearchCompletedCallback )
END_COM_MAP()

但后来我得到了 10 多个错误。

请帮助我成功编译和测试它。我感谢您的帮助!

标签: c++winapicomatl

解决方案


你也需要继承自CComObjectRootEx。基本上你需要按照 ATL 教程开始使用 ATL COM 对象。

class ATL_NO_VTABLE CFoo : 
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CFoo, &CLSID_Foo>,
    public IDispatchImpl<IFoo, &IID_IFoo, &LIBID_TESTLib>
{
public:
    CFoo()
    {
    }

DECLARE_REGISTRY_RESOURCEID(IDR_FOO)

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CFoo)
    COM_INTERFACE_ENTRY(IFoo)
    COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()

// IFoo
...

推荐阅读