发现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技术简直就是造成内存泄漏的超级凶手,每个人对它的理解都五花八门.