《COM原理与应用》的一处代码商讨,我认为处理不当
来源:互联网 发布:破解app软件 编辑:程序博客网 时间:2024/06/04 18:37
在看到COM聚合一章,有些代码有疑问,百度了下,发现了下面的东西,其实很有必要再类构造函数里清空指针值,以免“乱指”。
发信人: jessecw (晨晨), 信区: MSDN
标 题: 《COM原理与应用》的一处代码商讨,我认为处理不当
发信站: BBS 水木清华站 (Fri May 30 19:52:23 2003), 转信
今天我对潘老师第3章,第4章的代码进行调试分析的时候,发现第4章的代码
有一处会在一个特定的情况下引起异常。
程序是../AggRe/CompB中的一段:
// Implemention of class CB
CB::CB ()
{
m_Ref = 0;
g_CompBNumber ++ ;
m_pUnknownInner = NULL;
}
CB::~CB ( )
{
m_Ref = 1;
IUnknown *pUnknownOuter = this;
pUnknownOuter->AddRef();
if (m_pSomeInterface != NULL)
m_pSomeInterface->Release();
if (m_pUnknownInner != NULL)
m_pUnknownInner->Release();
}
一般情况下,不会出现异常。但是当CompA中的组件没有进行注册的时候?br /> CompCtRl中:
//...
hResult = CoCreateInstance(compBCLSID, NULL,
CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&pUnknown);
会调用失败,但这个时候出现了异常了。
原因是:B的类厂创建组件对象的时候出现了失败(A没有注册呀!)
HRESULT CBFactory::CreateInstance(IUnknown *pUnknownOuter,
const IID& iid, void **ppv)
{
CB *pObj;
HRESULT hr;
*ppv=NULL;
hr=E_OUTOFMEMORY;
if (NULL != pUnknownOuter)
return CLASS_E_NOAGGREGATION;
//Create the object passing function to notify on destruction.
pObj=new CB ();
if (NULL==pObj)
return hr;
pObj->AddRef(); // The Reference count of pObj is 1
hr = pObj->Init(); //当A没有注册的时候fail!
if (FAILED(hr) ) {
g_CompBNumber --; // Reference count g_CompBNumber be added in constructor
delete pObj; //会引起异常!
return E_FAIL;
}
//Obtain the first interface pointer (which does an AddRef)
hr=pObj->QueryInterface(iid, ppv);
pObj->Release(); // The Reference count of pObj is 1
return hr;
}
修改如下:
CB::CB ()
{
m_Ref = 0;
g_CompBNumber ++ ;
m_pUnknownInner = NULL;
//added by jessecw
m_pSomeInterface=NULL;
m_pUnknownInner=NULL;
}
这样就不会出现这个异常了。
我发这个帖子,不是说潘老师的书写的不好,相反我认为很不错,我买了一本在仔细
领会,如果不是仔细分析是不会发现这个小问题的。
我就是想拿出来和大家讨论讨论。请不要误会!
3X
--
Java is not platform-independent, it is the platform.
--Bjarne Stroustrup
http://www.smth.edu.cn/bbsanc.php?path=%2Fgroups%2Fcomp.faq%2FMSDN%2FcomAnddcom%2FM.1054294912.d0
- 《COM原理与应用》的一处代码商讨,我认为处理不当
- COM原理与应用----COM的实现
- COM原理与应用----COM的实现
- COM原理与应用----COM的实现
- COM原理与应用学习笔记一
- COM原理与应用学习笔记一
- 《COM 原理与应用》
- COM 原理与应用
- Com原理与应用的心得
- 我认为优秀的代码结构
- COM多线程原理与应用
- COM多线程原理与应用
- COM多线程原理与应用
- 《COM原理与应用》笔记
- COM多线程原理与应用
- 读书笔记-COM原理与应用
- COM多线程原理与应用
- COM组件开发知识重点——COM原理与应用篇(一)
- 第五章:隐藏实现 Hiding the Implementation
- 运用Detours库hook API
- XP下鼠标右键关联vs2008命令行工具
- 转:现在开始 Do It Now (4)
- fast report 2.45 版本的安装
- 《COM原理与应用》的一处代码商讨,我认为处理不当
- PHP SQL 注入攻击的技术实现以及预防办法
- Hello World
- 转:现在开始 Do It Now (3)
- 深入浅出MFC之Frame3
- 35岁以前成功的12条黄金法则(2)
- 转:现在开始 Do It Now (2)
- C++ 函数调用方式(_stdcall, _pascal, _cdecl...)总结
- 网络环境所需的相关服务的安装shell