如何使用shared_ptr来管理COM接口指针

4
我一直在阅读有关新的C ++标准智能指针unique_ptr,shared_ptr和weak_ptr的各种使用建议,并且当我编写声明和使用它们的代码时,通常会理解它们的含义。然而,我阅读过的所有讨论似乎都局限于这种简单的使用情况,即程序员在自己的代码中使用智能指针,没有真正探讨在与期望原始指针或其他类型的“智能指针”(如COM接口指针)的库一起工作时的技术。
具体而言,我正在通过尝试运行使用Direct2D和DirectWrite渲染文本以显示每秒帧数到显示器的标准Win32实时游戏循环来学习C ++。
我的第一个任务是使用MSDN上Direct2D示例中的以下代码创建Direct2D Factory对象:
ID2D1Factory* pD2DFactory = nullptr;
HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory);

pD2DFactory 显然是一个“out”参数,而我在这里变得不确定如何在这种情况下利用智能指针,如果可能的话。我的缺乏经验的C++思维告诉我有两个问题:

  1. 由于 pD2DFactory 是一个COM接口指针类型,智能指针如何与COM对象实例的Add() / Release()成员函数一起工作?
  2. 在函数使用“out”指针参数技术的情况下,智能指针能否传递给函数?

我尝试了使用comip.h头文件中的_com_ptr_t来帮助管理指针生命周期,并使用以下代码声明了pD2DFactory指针:

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

目前看来它似乎在工作,但是你可以看到,语法很繁琐 :)

所以,我想知道是否有C++大师能够确认智能指针是否能够在这种情况下帮助,并提供使用示例,或者将我指向更深入的智能指针用法讨论,尤其是当需要与不知道智能指针的其他代码库一起使用时。还是说我只是在尝试使用错误的工具? :)


3
这个问题可能更适合在 Stack Overflow 上发问,因为它完全是一个编程问题,而不是由游戏开发者更好地回答。 - doppelgreener
1
“但是,正如您所看到的,语法很繁琐。” 这就是 typedef 的用途。 - Nicol Bolas
1个回答

3

您需要使用typedef避免重复这个容易出错的声明。在comdef.h中,有一个宏专门用来处理这个常见问题:

_COM_SMARTPTR_TYPEDEF(ID2D1Factory, __uuid(ID2D1Factory));

现在你可以使用:

ID2D1FactoryPtr pD2DFactory;
// etc..

感谢建议。我正要为_com_ptr_t模板编写一个宏,但是comdef.h中的_COM_SMARTPTR_TYPEDEF正好解决了这个问题。我的示例代码正在编译并且似乎运行良好。我很想知道这些技术是否被用于商业游戏中来处理DirectX COM指针需求? - Darren Evans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接