2016-07-04 61 views
2

道歉,如果這個問題有點不專心。我正在使用COM,在Windows 10下使用Visual Studio 2015社區編寫一些簡單的COM服務器和對象。所有COM對象都必須實現IUnknown接口。 VS2015的IDE將提供實現超類的虛擬功能。所以,如果我創建「example.h文件」與這些內容:爲什麼MSDN或VS2015使用__stdcall約定聲明IUnknown方法?

#include <Unknwn.h> 

class MyClass : public IUnknown 
{ 
}; 

然後我選擇快速操作的重構和... /從右鍵菜單實現對類的所有純虛「MyClass的」,我得到一些生成的代碼在我的.h文件:

#include <Unknwn.h> 

class MyClass : public IUnknown 
{ 
    // Inherited via IUnknown 
    virtual HRESULT QueryInterface(REFIID riid, void ** ppvObject) override; 
    virtual ULONG AddRef(void) override; 
    virtual ULONG Release(void) override; 
}; 

而VS2015還爲我提供了一個存根實現:

#include "stdafx.h" 
#include "Example.h" 

HRESULT MyClass::QueryInterface(REFIID riid, void ** ppvObject) 
{ 
    return E_NOTIMPL; 
} 

ULONG MyClass::AddRef(void) 
{ 
    return 0; 
} 

ULONG MyClass::Release(void) 
{ 
    return 0; 
} 

這很好,但它不會編譯。只能通過調用約定重寫虛函數從「的IUnknown ::的QueryInterface」不同

我得到這個錯誤信息所有:我得到這個錯誤信息:

錯誤C2695:「CFactory3 ::的QueryInterface」三種方法。這很有意義,因爲每種方法的實際聲明都指定__stdcall調用約定。現在,我可以將它添加到聲明的MyClass,像這樣:

virtual HRESULT __stdcall QueryInterface(REFIID riid, void ** ppvObject) override; 
virtual ULONG __stdcall AddRef(void) override; 
virtual ULONG __stdcall Release(void) override; 

,編譯就好了。

我知道使用什麼調用約定,因爲,第一,當我使用「窺視定義,」我看到:

virtual HRESULT STDMETHODCALLTYPE QueryInterface( 
      /* [in] */ REFIID riid, 
      /* [iid_is][out] */ _COM_Outptr_ void __RPC_FAR *__RPC_FAR *ppvObject) = 0; 

鑽孔向下多一個層次,我看到STDMETHODCALLTYPE是簡單地定義爲一個宏__stdcall。其次,大部分教程資料我都建議使用STDMETHODIMP宏(其擴展爲HRESULT STDMETHODCALLTYPE)來實現IUnknown方法。

但是,當我查看IUnknown方法的MSDN Page時,沒有提到需要任何特定的調用約定。

所以我想知道爲什麼__stdcall約定沒有在IDNnknown方法的MSDN頁面上提及,以及VS2015 IDE爲什麼沒有在其子類的IUnknown的存根實現中包含它。

一般來說,如何查找COM或Windows的任何其他部分調用的方法或函數的必要調用約定?

+0

我在2016年7月5日寫了一篇關於connect.microsoft.com的錯誤報告。2016年7月7日,它今天早上在那裏。但現在是中午,我的報告消失得無影無蹤。 –

回答

0

...從右鍵菜單中,我得到一些生成的代碼在我的.h文件:

你打的問題是,Visual Studio IDE中不兌現的調用約定現有接口聲明並生成默認調用約定的代碼而不是__stdcall

所以你基本上應該編輯到STDMETHOD,你很好從那裏去。並且希望下一個Visual Studio在代碼生成和重構工具中考慮調用約定。

The __stdcall calling convention is used to call Win32 API functions.

基本上這調用約定是所有COM方法,以及其他的API聲明(通常是通過宏STDMETHODSTDMETHOD_STDMETHODCALLTYPE等使用)標準:CALLBACKWINAPI決心__stdcall

MSDN應該已經瞭解__stdcall更加清晰,而不是假定它goes without saying

...某些必要的調用約定的詳細信息,如__stdcall留出了這個例子...

如果您對使用Windows API進行通信時使用的約定存在疑問,請從__stdcall開始,因爲這是您的最佳選擇。

相關問題