【问题标题】:Advice when using COM Object/CComPtr and the STL使用 COM Object/CComPtr 和 STL 时的建议
【发布时间】:2011-02-12 18:24:47
【问题描述】:

我正在使用 directshow 做一些与 COM 相关的事情,例如:

typedef CComPtr<IBaseFilter> AutoIBaseFilterPtr;
map<CString, AutoIBaseFilterPtr> _filterMap;

存储与directShow 相关的com 对象及其友好名称的列表。

在找到this article (See:Problem 2) 了解 VC10 编译器中的更改可能如何影响以前的 OK 代码后,我想知道在混合 STL 和 CComPtr 时是否还有其他需要注意的事情,或者可能只是混合 STL 和 COM。

任何提示将不胜感激,谢谢

【问题讨论】:

  • 感谢该文章的链接。
  • 我认为 CAdapt 对于 STL 是推荐的,甚至是必要的ATL 桥接已经有一段时间了?
  • 我对 COM 还是有点陌生​​,所以我并没有真正意识到 CAdapt 与 STL 的使用,但是看着它,是的,它似乎是推荐的,但我猜有很多很少有人在尝试在 VC10 下编译他们的程序时可能会有一个令人讨厌的惊喜。我的问题是为了找出更多我可能落入令人讨厌的陷阱的案例。顺便说一句,感谢您的标签编辑。
  • 我很高兴跟踪和修复错误,却发现它们是由于缺乏 CAdapt 使用引起的 - 编译器会在构建时阻止您...

标签: c++ visual-c++ com stl atl


【解决方案1】:

我能想到的唯一一点没有提到的是CAdaptCComBSTRCComPtr 所必需的,因为它也重载了operator&amp;

事实上,重载operator&amp; 使得CAdapt 成为必要,因为许多STL 容器要求获取某物X 的地址返回指向所述X 的指针。

【讨论】:

  • 标记为答案,尽管我的问题是开放式的,但你是唯一一个回复的人:)
  • 对于 VC2010 RTM 中的所有 STL 容器和大多数 STL 算法,CComPtrCComBSTR 都不再需要 CAdapt。这是因为它现在使用std::addressof(C++0x 中的新事物)而不是直接应用operator&amp; 来获取对象的地址,并且该辅助函数可以解决任何重载的operator&amp;,并且始终提供实际的指针.
  • 帕维尔;感谢您提供的信息,我还没有研究过 VS2010。我需要阅读 std::addressof ——看起来很有趣!
猜你喜欢
  • 1970-01-01
  • 2015-09-03
  • 2011-10-14
  • 2021-08-30
  • 2011-05-16
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
相关资源
最近更新 更多