gpt4 book ai didi

c++ - 带有 COM 对象数组的 RAII

转载 作者:行者123 更新时间:2023-11-28 03:10:00 25 4
gpt4 key购买 nike

问题:

在 COM 中,您偶尔会发现带有类似 this 签名的函数:

HRESULT STDMETHODCALLTYPE GetColorContexts( 
UINT cCount,
IWICColorContext **ppIColorContexts,
UINT *pcActualCount)

这给我带来的问题是 ppIColorContexts必须是 initialized IWICColorContext * 的数组.我尝试引用 Vector 的第一个元素的 ATL::CComPtr<IWICColorContext>没有这样的运气,它不会触发 ()运算符,因此它会提示类型不匹配。

尝试的解决方案:

  • vector<ATL::CComPtr<IWICColorContext>>由于类型不匹配而失败, 如评论中所述,这还有其他问题,如 CComPtr重载 operator &这会破坏 STL 容器。 这似乎是 fixed in C++11并在VC2010被收录到STL
  • BOOST_SCOPE_EXIT_ALL有效,但仍然意味着我要手动管理 COM 对象的生命周期,这是我想避免的事情。

未尝试的解决方案:

  • 自定义数据结构 - 如果没有更优雅的解决方案,这可能是我必须要做的,但至少它可以让我正确地利用破坏语义。
  • 附上 CComPtr在这次通话之后 - 我不喜欢这个解决方案,因为它给我留下了一段执行时间,如果出现问题,资源可能不会被释放。
  • std::unique_ptr<IWICColorContext[]>使用自定义删除器 - 我还没有完全探索这种可能性,但它会确保 COM 对象总是被释放。

最佳答案

我会通过将原始指针 vector 传递给函数,然后复制到另一个 CComPtr vector 来实现。

std::vector<IWICColorContext *> vec(5, NULL);
UINT nActualCount = 0;
GetColorContexts(vec.size(), &vec[0], &nActualCount);
std::vector<CComPtr<IWICColorContext> > results(vec.begin(), vec.begin() + nActualCount);

唯一不幸的部分是 CComPtr 构造函数执行了一个 AddRef 因此您必须在原始指针上执行相应的 Release重新迷路。

for (auto it = vec.begin(); it != vec.end(); ++it)
if (*it != NULL)
(*it)->Release();
vec.clear();

关于c++ - 带有 COM 对象数组的 RAII,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18741648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com