IUnknown ** 指针的指针 释放问题
各位朋友:
我初学写COM组件,有个程序需要用DLL来传递COM对象,传递对象的接口被定义为IUnknown ** 指向指针的指针。我写了如下代码,但Release COM对象却出现了错误。关键代码如下(其他代码我已经过滤):
int32 Read_Xml_File(char * XML_Path, LStrHandle Out_Put_File, IUnknown ** lvIUnknown)
{
CComPtr<MSXML::IXMLDOMDocument> spDoc;
HRESULT hr;
IUnknown * pIUnknown;
//一般的IUnknown 指针 pIUnknown
hr = spDoc->QueryInterface(IID_IXMLDOMDocument, (void**)&pIUnknown);
//指向IUnknown 对象的指针 lvIUnknown
hr = pIUnknown->QueryInterface(IID_IXMLDOMDocument,(void**)(&(*lvIUnknown)));
//pIUnknown Release没问题
pIUnknown->Release();
//这里释放就导致程序崩溃了
(*lvIUnknown)->Release();
}
我应该怎么做才能确保Release成功?
我初学写COM组件,有个程序需要用DLL来传递COM对象,传递对象的接口被定义为IUnknown ** 指向指针的指针。我写了如下代码,但Release COM对象却出现了错误。关键代码如下(其他代码我已经过滤):
int32 Read_Xml_File(char * XML_Path, LStrHandle Out_Put_File, IUnknown ** lvIUnknown)
{
CComPtr<MSXML::IXMLDOMDocument> spDoc;
HRESULT hr;
IUnknown * pIUnknown;
//一般的IUnknown 指针 pIUnknown
hr = spDoc->QueryInterface(IID_IXMLDOMDocument, (void**)&pIUnknown);
//指向IUnknown 对象的指针 lvIUnknown
hr = pIUnknown->QueryInterface(IID_IXMLDOMDocument,(void**)(&(*lvIUnknown)));
//pIUnknown Release没问题
pIUnknown->Release();
//这里释放就导致程序崩溃了
(*lvIUnknown)->Release();
}
我应该怎么做才能确保Release成功?
...全文
相关推荐
COM IUnknown接口封装
在`IUnknown`的封装过程中,还需要注意线程安全问题,特别是在多线程环境中,`AddRef`和`Release`操作需要确保是线程安全的。
com原理小例子(IUnKnown接口的实现)
这确保了组件知道有多少个引用指向它,以便在不再使用时正确释放资源。3. Release:减少对象引用计数。当不再需要接口实例时,调用此方法。当引用计数降为0时,释放对象的内存。
C++ COM编程之QueryInterface函数(一)
当引用计数为0时,表示没有客户端在使用该接口,这时组件可以被释放。不过,这些内容将在后续的文章中详细讨论。
组件技术常见习题
这意味着所有COM接口都要从IUnknown继承,并且它们的Vtbl结构中,这三个函数的排列顺序是固定的。由于IUnknown不是虚拟基类,所以COM接口的继承是非虚拟的,避免了不兼容的Vtbl问题。
ATL源码学习-聚合的支持
**构造函数和析构函数**:在聚合对象的构造函数中,需要初始化子对象,并在析构函数中释放它们。这通常涉及到调用子对象的构造函数和IUnknown的AddRef,以及在析构时调用Release。7.


