问题:
在 COM 中,您偶尔会发现具有如下签名的函数:
HRESULT STDMETHODCALLTYPE GetColorContexts(
UINT cCount,
IWICColorContext **ppIColorContexts,
UINT *pcActualCount)
这给我带来的问题是,它ppIColorContexts
必须是一个已初始化的IWICColorContext *
. 我尝试引用 a Vector
of的第一个元素,ATL::CComPtr<IWICColorContext>
但没有这样的运气,它不会触发()
运算符,因此它抱怨类型不匹配。
尝试的解决方案:
vector<ATL::CComPtr<IWICColorContext>>
由于类型不匹配而失败,如评论中所述,这还有其他问题,例如破坏 STL 容器的似乎这在 C++11 中已修复,并包含在 VC2010 的 STL 中CComPtr
重载。operator &
BOOST_SCOPE_EXIT_ALL
有效,但仍然意味着我正在手动管理 COM 对象的生命周期,这是我想摆脱的。
未尝试的解决方案:
- 自定义数据结构——如果没有更优雅的解决方案,这可能是我必须做的,但至少它可以让我正确地利用破坏语义。
- 在这个调用之后附加一个
CComPtr
- 我不喜欢这个解决方案,因为它给我留下了一段执行时间,如果出现问题,资源可能不会被释放。 std::unique_ptr<IWICColorContext[]>
使用自定义删除器 - 我还没有完全探索这种可能性,但它可以确保 COM 对象总是被释放。