Вопрос по ООП с++ Эррор: ---- error C2555: 'Cieobj::SetSite' : overriding virtual function differs from 'ATL::IObjectWithSiteImpl<class Cieobj>::SetSite' only by return type or calling convention ----- Возникает в проекте ATL при переопределении ф-ции HRESULT SetSite(IUnknown *pUnkSite); Вот описалово класса -- class ATL_NO_VTABLE Cieobj : public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<Cieobj, &CLSID_ieobj>, public IObjectWithSiteImpl<Cieobj>, public IDispatchImpl<Iieobj, &IID_Iieobj, &LIBID_BHOTEST1Lib> { public: Cieobj() { } DECLARE_REGISTRY_RESOURCEID(IDR_IEOBJ) DECLARE_PROTECT_FINAL_CONSTRUCT() BEGIN_COM_MACieobj) COM_INTERFACE_ENTRY(Iieobj) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(IObjectWithSite) END_COM_MA) // Iieobj public: CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> m_spWebBrowser2; CComQIPtr<IConnectionPointContainer, &IID_IConnectionPointContainer> m_spCPC; HRESULT SetSite(IUnknown *pUnkSite); // вот ТУТ косяк }; ---- Не могу переопределить ф-цию SetSite()! В чем дело. Помогите плз.
А вот сама реализация ф-ции в .cpp файле: HRESULT Cieobj::SetSite(IUnknown *pUnkSite){ // Retrieve and store the IWebBrowser2 pointer m_spWebBrowser2 = pUnkSite; if (m_spWebBrowser2 == NULL) return E_INVALIDARG; // Retrieve and store the IConnectionPointerContainer pointer m_spCPC = m_spWebBrowser2; if (m_spCPC == NULL) return E_POINTER; // Retrieve and store the HWND of the browser. Plus install // a keyboard hook for further use RetrieveBrowserWindow(); // Connect to the container for receiving event notifications return Connect(); }
ну русским языком написано что твоя функа с неправильным return type или calling convention. Смотрим atlcom.h, строка 3576 и видим Код (Text): STDMETHOD(SetSite)(IUnknown *pUnkSite) а STDMETHOD это Код (Text): #define STDMETHOD(method) virtual HRESULT STDMETHODCALLTYPE method а STDMETHODCALLTYPE это Код (Text): #define STDMETHODCALLTYPE __stdcall выводы - либо напиши у себя Код (Text): HRESULT [b]__stdcall[/b] SetSite(IUnknown *pUnkSite); // вот ТУТ косяк а еще лучше вот так: Код (Text): [b]STDMETHOD[/b](SetSite)(IUnknown *pUnkSite) ; // вот ТУТ косяк и будет счастье. ps: RTFM как обычно рулит