如何将共享_ptr用于com接口指针

How to use shared_ptr for COM interface pointers

本文关键字:用于 com 接口 指针 ptr 共享      更新时间:2023-10-16

我一直在阅读有关与新的C 标准智能指针 unique_ptr,shared_ptr feek_ptr 的各种用法建议以及一般''当我编写自己的代码并宣布并消耗它们时,他们是什么。

但是,我阅读的所有讨论似乎都限于这种简单的用法情况,在这些情况下,程序员在他/她自己的代码中使用SMART,而在必须与期望原始指针或其他库的图书馆合作时,没有真正的讨论"智能指针"的类型,例如com接口指针。

特别是,我尝试通过使用Direct2D&DirectWrite渲染文本到显示每秒帧的显示。

我对Direct2D的第一个任务是创建一个Direct2D Factory对象,并在MSDN上的Direct2D示例中使用以下代码:

ID2D1Factory* pD2DFactory = nullptr;
HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory);

pd2dfactory 显然是一个"输出"参数,在这里我变得不确定如何在这种情况下使用智能指针,如果确实可以。我没有经验的C 思维告诉我,我有两个问题:

  1. 使用 pd2dfactory 作为com接口指针类型,smart_ptr如何与com对象实例的add()/reparter()/reparter()/reparte()成员函数一起使用?
  2. 在功能使用" OUT"指针参数技术的情况下,智能指针能够传递给函数吗?

我确实尝试了在 comip.h 标题文件中使用 _com_ptr_t 的替代方法,以帮助指针终身管理并声明 pd2dfactory 用以下代码指针:

_com_ptr_t<_com_IIID<pD2DFactory, &__uuidof(pD2DFactory)>> pD2DFactory = nullptr;

似乎工作到目前为止工作,但是,如您所见,语法很麻烦:)

所以,我想知道这里是否有任何C 大师可以确认智能指针在此类情况下是否能够提供帮助,或者指出我需要在需要使用时对智能指针使用的更深入的讨论其他对它们一无所知的代码库。还是只是我试图将错误的工具用于工作的情况?:)

您需要使用typedef来避免重复此易于错误的声明。这是如此普遍,以至于Comdef.h有一个宏:

_COM_SMARTPTR_TYPEDEF(ID2D1Factory, __uuid(ID2D1Factory));

现在您可以使用:

ID2D1FactoryPtr pD2DFactory;
// etc..