Как побороть этот эррор (с++)?

Тема в разделе "WASM.BEGINNERS", создана пользователем ZeroMemory, 3 фев 2005.

  1. ZeroMemory

    ZeroMemory New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    79
    Вопрос по ООП с++

    Эррор:

    ----

    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()! В чем дело. Помогите плз.
     
  2. ZeroMemory

    ZeroMemory New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    79
    А вот сама реализация ф-ции в .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();

    }
     
  3. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    ну русским языком написано что твоя функа с неправильным return type или calling convention.

    Смотрим atlcom.h, строка 3576 и видим
    Код (Text):
    1. STDMETHOD(SetSite)(IUnknown *pUnkSite)


    а STDMETHOD это
    Код (Text):
    1. #define STDMETHOD(method)     virtual HRESULT STDMETHODCALLTYPE method


    а STDMETHODCALLTYPE это
    Код (Text):
    1. #define STDMETHODCALLTYPE     __stdcall


    выводы - либо напиши у себя
    Код (Text):
    1. HRESULT [b]__stdcall[/b] SetSite(IUnknown *pUnkSite); // вот ТУТ косяк


    а еще лучше вот так:
    Код (Text):
    1. [b]STDMETHOD[/b](SetSite)(IUnknown *pUnkSite) ; // вот ТУТ косяк


    и будет счастье.

    ps: RTFM как обычно рулит :)
     
  4. ZeroMemory

    ZeroMemory New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    79
    Спасибо ;). Из этого вывод - садиться работать только трезвым :lol: