gpt4 book ai didi

c# - COM 对象清理

转载 作者:搜寻专家 更新时间:2023-10-31 02:00:10 25 4
gpt4 key购买 nike

下面两行代码有什么区别:

CComPtr< IInterface > m_interface;

IInterface* m_interface;

我知道 CComPtr 有助于消除内存泄漏,但我得到的结果不一致。用 CComPtr< IInterface > m_interface; 声明指针时在我的 C# 代码中使用接口(interface)没有错误,但是在 VC++ 中使用接口(interface)我得到一个未处理的异常错误,即使我注释掉了 IInterface 的实例创建。

我很确定问题出在这里:

STDMETHODIMP CSomeClass::get_IClass(IClass** var)
{
return m_class_var->QueryInterface(var);
}
STDMETHODIMP CSomeClass::putref_IClass(IClass* var)
{
m_class_var = var;
return S_OK;
}

当我声明接口(interface)指针时:IInterface* m_interface;在 C# 中测试接口(interface)时出现 RPC_E_SERVERFAULT 错误,必须显式调用 GC.Collect() 以避免在实例化几个对象后引发错误。在 VC++ 中测试接口(interface)时,错误是一致的,但发生的时间不同。如果我注释掉 IInterface 的实例创建,代码运行正常,但是当我尝试创建一个实例时,我会得到与以前相同的错误,只是一个模糊的未处理异常错误。我在这里做错了什么?

最佳答案

CComPtr 是一个智能指针,设计用于在与 COM 习惯用法一起使用时做“正确”的事情。

get_IClass 的代码看起来不错,但是 putref_IClass 需要在 IClass 上调用 AddRef重新存储它。如果您使用 CComPtr,那将自动发生。

您需要添加有关 VC++ 未处理异常的更多详细信息。

关于c# - COM 对象清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2337100/

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