我有一个COM函数应该返回一个SafeArray通过LPSAFEARRAY*
出参数。 该函数使用ATL的CComSafeArray
模板类创建SafeArray。 我天真的执行情况,以便从本地变量移动所有权的输出参数使用CComSafeArray<T>::Detach()
:如何将本地CComSafeArray返回到LPSAFEARRAY输出参数?
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
操作,这样,当在这个安全数组(主要的sa
的新主人情况)被破坏锁不是零,并且Destroy
未能解锁SafeArray与E_UNEXPECTED
(这导致内存泄漏,因为SafeArray未取消分配)。
通过COM方法边界将所有权转移到CComSafeArrays的正确方法是什么?
编辑:从单一的答案到目前为止,似乎错误是在客户端(main
),而不是从服务器端(foo
),但我觉得很难相信CComSafeArray
WASN不是为这个简单的用例设计的,必须有一个优雅的方法来将SafeArray从COM方法中取出,并将其转换为CComSafeArray
。
您正在使用哪个版本的Visual Studio? – 2009-11-22 21:39:56
这发生在VS8(2005)和VS9(2008) – Motti 2009-11-23 06:55:34
基于我的经验,我相信设计CComSafeArray的人从来没有真正使用它。如果需要,您可以使用自己的包装类。 – Amnon 2009-11-25 13:16:52