gpt4 book ai didi

c++ - END_COM_MAP 中 IUnknown 成员函数的用途是什么?

转载 作者:行者123 更新时间:2023-11-27 22:31:41 28 4
gpt4 key购买 nike

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;

它旨在用于定义从 COM 接口(interface)继承的类,例如:

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()
};

这意味着QueryInterface()、AddRef() 和Release() 在此类中被声明为纯虚拟的。因为我没有定义它们的实现,所以这个类应该是不可创建的。然而 ATL 成功实例化了它。

它是如何工作的,为什么那些 IUnknown 成员函数在这里重新声明?

最佳答案

自从我使用 ATL 以来已经有一段时间了,但是,IIRC,最终被实例化的不是 CMyClass ,但是CComObject<CMyClass> .

CComObject工具 IUnknown并继承自其模板参数。

编辑:MSDN 上的“Fundamentals of ATL COM Objects”页面很好地说明了正在发生的事情。

关于c++ - END_COM_MAP 中 IUnknown 成员函数的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1729834/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com