gpt4 book ai didi

c++ - 如何将本地 CComSafeArray 返回到 LPSAFEARRAY 输出参数?

转载 作者:可可西里 更新时间:2023-11-01 15:07:12 35 4
gpt4 key购买 nike

我有一个应该通过 LPSAFEARRAY* 返回 SafeArray 的 COM 函数出参数。该函数使用 ATL 的 CComSafeArray 创建 SafeArray模板类。我天真的实现使用 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 的新所有者(在本例中为 main 的 sa)被销毁时,锁不为零且 Destroy使用 E_UNEXPECTED 解锁 SafeArray 失败(这会导致内存泄漏,因为 SafeArray 未被释放)。

通过 COM 方法边界在 CComSafeArrays 之间转移所有权的正确方法是什么?


编辑: 从到目前为止的单一答案来看,错误似乎出在客户端 ( main ) 而不是服务器端 ( foo ),但我发现很难相信CComSafeArray不是为这个微不足道的用例设计的,必须有一种优雅的方法将 SafeArray 从 COM 方法中获取到 CComSafeArray 中.

最佳答案

问题是您直接设置了接收 CComSafeArray 的内部指针。使用 Attach() 方法将现有的 SAFEARRAY 附加到 CComSafeArray:

LPSAFEARRAY ar;
foo(&ar);
CComSafeArray<VARIANT> sa;
sa.Attach(ar);

关于c++ - 如何将本地 CComSafeArray 返回到 LPSAFEARRAY 输出参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1778491/

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