c++ - 如何使用 shared_ptr 作为 COM 接口(interface)指针

标签 c++

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

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

具体来说,我正在学习 C++,方法是尝试启动并运行标准的 Win32 实时游戏循环,该循环使用 Direct2D 和 DirectWrite 将文本渲染到显示每秒帧数的显示器上。

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

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

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

  1. 由于 pD2DFactory 是 COM 接口(interface)指针类型,smart_ptr 如何与 COM 对象实例的 Add()/Release() 成员函数一起工作?
  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..

关于c++ - 如何使用 shared_ptr 作为 COM 接口(interface)指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13110968/

相关文章:

c++ - 如何生成一个长度为n位的数

c++ - "signed char"和 "unsigned char"能否始终相互转换而不丢失数据?

c++ - == 为 std::map 定义的运算符

c++ - 如何从调用原始函数的自定义函数中获取错误?你有更好的建议吗?

c++ inotify - 观看多个目录/子目录

c++14 unique_ptr 并使 unique_ptr 错误使用已删除函数 'std::unique-ptr'

c++ - 在 C++ 中,使用模板根据状态更改函数调用的行为

c++ - 如何有效地循环连续数字c++

c++ - 为什么 C++20 模板 lambda 使用 typename 关键字?

c++ - 两种类型的构造函数重载