2013-05-23 11 views
8

Próbuję wdrożyć IUnknown. Postępowałem zgodnie z instrukcją do tee, ale to nie działa. Kiedy próbuję skompilować uzyskać:Co przesłonić funkcję wirtualną różni się tylko przez wywołanie średniej konwencji?

Error 2 error C2695: 'testInterfaceImplementation::AddRef': overriding virtual function differs from 'IUnknown::AddRef' only by calling convention c:\users\seanm\desktop\test\test\source.cpp 6 1 test 
Error 3 error C2695: 'testInterfaceImplementation::QueryInterface': overriding virtual function differs from 'IUnknown::QueryInterface' only by calling convention c:\users\seanm\desktop\test\test\source.cpp 14 1 test 
Error 4 error C2695: 'testInterfaceImplementation::Release': overriding virtual function differs from 'IUnknown::Release' only by calling convention c:\users\seanm\desktop\test\test\source.cpp 22 1 test 

z tym kodem:

#include <Windows.h> 
#include <tchar.h> 

class testInterfaceImplementation : public IUnknown { 
    protected: 
     ULONG AddRef() 
     { 
      MessageBox(NULL, 
       _T("TEST1"), 
       _T("TEST1"), 
       NULL); 
      return 0; 
     } 
     HRESULT QueryInterface(IN REFIID riid, OUT void **ppvObject) 
     { 
      MessageBox(NULL, 
       _T("TEST2"), 
       _T("TEST2"), 
       NULL); 
      return S_OK; 
     } 
     ULONG Release() { 
      MessageBox(NULL, 
       _T("TEST3"), 
       _T("TEST3"), 
       NULL); 
      return 0; 
     } 
}; 
+0

Komunikat o błędzie oznacza dokładnie to, co mówi. Aby zastąpić funkcję, wszystko musi być identyczne. Ale twoje przesłonięcie nie jest identyczne z funkcją podstawową. Funkcja podstawowa i twoja funkcja mają różne konwencje wywoływania. Napraw funkcję, aby mieć tę samą konwencję wywoływania, co funkcja podstawowa. –

+0

Nie powinieneś zwracać 'S_OK' z tak niepełnej implementacji' QI() '- coś takiego jak' E_FAIL' byłoby znacznie lepsze. – sharptooth

Odpowiedz

16

Dodaj STDMETHODCALLTYPE dla każdej z metod.

ULONG STDMETHODCALLTYPE AddRef() 
HRESULT STDMETHODCALLTYPE QueryInterface(IN REFIID riid, OUT void **ppvObject) 
ULONG STDMETHODCALLTYPE Release() 

Klasa podstawy (IUnknown) metody uznane jako STDMETHODCALLTYPE (który jest makrofotografii __stdcall). W przypadku nadpisania metody wirtualnej musi ona mieć tę samą konwencję wywołania co oryginał, który w tym przypadku jest __stdcall

+0

heck yes! dzięki! – user1873073

Powiązane problemy