道歉,如果這個問題有點不專心。我正在使用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的任何其他部分調用的方法或函數的必要調用約定?
我在2016年7月5日寫了一篇關於connect.microsoft.com的錯誤報告。2016年7月7日,它今天早上在那裏。但現在是中午,我的報告消失得無影無蹤。 –