2013-05-23 10 views
8

IUnknown'u uygulamaya çalışıyorum. Tişört için talimatı takip ettim ama çalışmıyor. Ben derlemeye çalıştığımda alıyorum:Sanal işlevi geçersiz kılan, yalnızca çağrının anlamı nedir?

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 

bu koddan:

#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

Hata mesajı, tam olarak ne ifade ettiği anlamına gelir. Bir işlevi geçersiz kılmak için, her şey aynı olmalıdır. Ama geçersiz kılma, temel işlevle aynı değil. Temel işlev ve işleviniz farklı çağrı kurallarına sahiptir. Fonksiyonunuzu, temel işlevle aynı çağrı kuralına sahip olacak şekilde düzeltin. –

+0

"S_OK" ifadesini bu tür tamamlanmamış QI() 'den geri döndürmemelisiniz - E_FAIL gibi bir şey çok daha iyi olurdu. – sharptooth

cevap

16

yöntemlerin her biri için STDMETHODCALLTYPE ekleyin.

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

temel sınıf (IUnknown) yöntemleri (__stdcall için bir makro olan) STDMETHODCALLTYPE olarak bildirilmiştir. Bir sanal yöntemi geçersiz kıldığınızda, bu durumda orijinal olarak aynı çağrı kuralı olması gerekir. Bu durumda bu, __stdcall

+0

heck evet! Teşekkürler! – user1873073