发现BCB6的TComInterface实现有点问题

来源:互联网 发布:excel数据分类汇总ppt 编辑:程序博客网 时间:2024/05/16 12:38

发现BCB6的TComInterface实现有点问题

TComInterface类似于VC的Com指针,赋值时会AddRef,释放时会Release.
例:
    IHTMLDocument2 *pDoc=NULL;
    cb->Document->QueryInterface(__uuidof(IHTMLDocument2),(void**)&pDoc);  //cb是TCppWebBrowser控件
    if(pDoc)
    {
 //...
        pDoc->Release();
    }
可以改成:
TComInterface <IHTMLDocument2> pDoc(cb->Document);
if(pDoc)
{
 //... 
}

但是运行它会出现内存读写错误,最后发现utilcls.h 第2991行

template <class I> TComInterface(const DelphiInterface<I>& src)

应改成

template <class I> TComInterface(const DelphiInterface<I>& src) : intf(0)

否则因intf未初始化为0, 它随后调用的if(intf) intf->Release()会出错.


另外还有一疑问,以我的理解此构造函数的代码里应该不用AddRef才对,因为它调用的operator=(const DelphiInterface<I>& src)里使用了QueryInterface.
So 偶把AddRef这行也注释了, 是不是正确不敢说

感言:微软的COM技术简直就是造成内存泄漏的超级凶手,每个人对它的理解都五花八门.