sha*_*oth 0 c++ com atl visual-c++
ATL END_COM_MAP宏定义如下:
#define END_COM_MAP() \
__if_exists(_GetAttrEntries) {{NULL, (DWORD_PTR)_GetAttrEntries, _ChainAttr }, }\
{NULL, 0, 0}}; return _entries;} \
virtual ULONG STDMETHODCALLTYPE AddRef( void) throw() = 0; \
virtual ULONG STDMETHODCALLTYPE Release( void) throw() = 0; \
STDMETHOD(QueryInterface)(REFIID, void**) throw() = 0;
Run Code Online (Sandbox Code Playgroud)
它旨在用于从COM接口继承的类的定义中,例如:
class ATL_NO_VTABLE CMyClass :
public CComCoClass<CMyClass, &MyClassGuid>,
public CComObjectRoot,
public IMyComInterface
{
public:
BEGIN_COM_MAP( CMyClass )
COM_INTERFACE_ENTRY( IMyComInterface)
END_COM_MAP()
};
Run Code Online (Sandbox Code Playgroud)
这意味着QueryInterface(),AddRef()和Release()在此类中声明为纯虚拟.由于我没有定义它们的实现,因此该类应该是不可创建的.然而ATL成功实例化了它.
它是如何工作的以及为什么这些IUnknown成员函数在这里被重新声明?
自从我使用ATL已经有一段时间了,但是,IIRC,最终被实例化的不是CMyClass,但是CComObject<CMyClass>.
CComObject实现IUnknown并从其模板参数继承.
编辑:MSDN上的" ATL COM对象的基础知识 "页面很好地说明了正在发生的事情.
| 归档时间: |
|
| 查看次数: |
797 次 |
| 最近记录: |