2013-05-23 24 views
8

Tôi đang cố triển khai IUnknown. Tôi làm theo hướng dẫn cho tee nhưng nó không hoạt động. Khi tôi cố gắng biên soạn tôi nhận được:Chức năng ghi đè ảo nào khác chỉ bằng cách gọi quy ước có nghĩa là gì?

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 

từ mã này:

#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

Thông báo lỗi có nghĩa là chính xác những gì nó nói. Để ghi đè hàm, mọi thứ phải giống hệt nhau. Nhưng ghi đè của bạn không giống với hàm cơ sở. Hàm cơ sở và hàm của bạn có các quy ước gọi khác nhau. Sửa hàm của bạn để có cùng quy ước gọi là hàm cơ sở. –

+0

Bạn không nên trả về 'S_OK' từ việc thực thi' QI() 'chưa hoàn chỉnh - một thứ như' E_FAIL' sẽ tốt hơn nhiều. – sharptooth

Trả lời

16

Thêm STDMETHODCALLTYPE cho từng phương pháp.

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

Các lớp cơ sở (IUnknown) phương pháp được khai báo là STDMETHODCALLTYPE (mà là một vĩ mô cho __stdcall). Khi bạn ghi đè lên một phương thức ảo, nó phải có cùng quy ước gọi là nguyên gốc trong trường hợp này là __stdcall

+0

heck yes! cảm ơn! – user1873073

Các vấn đề liên quan