如何将shared_ptr用于COM接口指针

时间:2012-10-28 00:22:05

标签: c++

我一直在阅读有关新c ++标准智能指针 unique_ptr,shared_ptr weak_ptr 的各种使用建议,并且通常'grok'当我关于它们时它们是什么我正在编写自己的代码来声明和使用它们。

然而,我所阅读的所有讨论似乎都局限于这种简单的使用情况,即程序员在他/她自己的代码中使用智能,而在必须使用期望原始指针或其他的库时,没有真正的技术讨论。 “智能指针”的类型,如COM接口指针。

具体来说,我正在通过尝试获得标准的Win32实时游戏循环并使用Direct2D& DirectWrite将文本呈现给显示器,显示每秒帧数。

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

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

pD2DFactory 显然是一个'out'参数,在这里我不确定如何在这种情况下使用智能指针,如果确实有可能的话。我缺乏经验的C ++头脑告诉我,我有两个问题:

  1. 如果 pD2DFactory 是COM接口指针类型,那么smart_ptr如何使用COM对象实例的Add()/ Release()成员函数?
  2. 在函数使用'out'指针参数技术的情况下,是否能够将智能指针传递给函数?
  3. 我在 comip.h 头文件中尝试使用 _com_ptr_t 的替代方法来帮助指针生存期管理并声明 pD2DFactory 指针包含以下代码:

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

    它似乎工作到目前为止,但正如你所看到的,语法很麻烦:)

    所以,我想知道这里是否有任何C ++专家可以确认智能指针是否能够在这样的情况下提供帮助并提供使用示例,或者指出我需要使用时更深入地讨论智能指针的使用情况其他代码库,对它们一无所知。或者仅仅是我试图使用错误的工具来完成这项工作? :)

1 个答案:

答案 0 :(得分:3)

您需要使用typedef来避免重复此容易出错的声明。这是如此常见,comdef.h有一个宏:

_COM_SMARTPTR_TYPEDEF(ID2D1Factory, __uuid(ID2D1Factory));

现在你可以使用:

ID2D1FactoryPtr pD2DFactory;
// etc..
相关问题