2016-07-04 71 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开始,因为这是您的最佳选择。

相关问题