道歉,如果这个问题有点不专心。我正在使用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日,它今天早上在那里。但现在是中午,我的报告消失得无影无踪。 –