4

我一直在阅读与新的 c++ 标准智能指针unique_ptr、shared_ptrweak_ptr相关的各种使用建议,并且通常在我编写自己的代码来声明和使用它们时“了解”它们的含义。

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

具体来说,我通过尝试启动和运行标准 Win32 实时游戏循环来学习 C++,该循环使用 Direct2D 和 DirectWrite 将文本呈现到显示每秒帧数的显示器上。

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

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

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

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

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

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

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

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

4

1 回答 1

3

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

_COM_SMARTPTR_TYPEDEF(ID2D1Factory, __uuid(ID2D1Factory));

现在您可以使用:

ID2D1FactoryPtr pD2DFactory;
// etc..
于 2012-10-28T17:37:00.370 回答