我有一个COM函数应该通过a返回一个SafeArray LPSAFEARRAY*
输出参数。
该函数使用ATL创建SafeArray CComSafeArray
模板类。
我天真的实现使用 CComSafeArray<T>::Detach()
为了将所有权从局部变量移动到输出参数:
void foo(LPSAFEARRAY* psa)
{
CComSafeArray<VARIANT> ret;
ret.Add(CComVariant(42));
*psa = ret.Detach();
}
int main()
{
CComSafeArray<VARIANT> sa;
foo(sa.GetSafeArrayPtr());
std::cout << sa[0].lVal << std::endl;
}
问题是 CComSafeArray::Detach()
执行 Unlock
操作,以便当SafeArray的新所有者(主要的 sa
在这种情况下)被破坏,锁不是零和 Destroy
无法解锁SafeArray E_UNEXPECTED
(这会导致内存泄漏,因为SafeArray未被释放)。
通过COM方法边界将所有权转移到CComSafeArrays的正确方法是什么?
编辑: 从单一答案到目前为止,似乎错误是在客户端(main
)而不是从服务器端(foo
),但我觉得很难相信 CComSafeArray
不是为这个琐碎的用例而设计的,必须有一种优雅的方法来将一个COM方法中的SafeArray变成一个 CComSafeArray
。