容易疏忽的问题:CComVariant.ReadFromStream失败时的处理

在序列化与反序列化中,我们经常使用CComVariant.ReadFromStream从一个数据流中读取变量。常规的代码如下:

 

一般情况下,这段代码可以很好的工作。但有时就会导致程序的崩溃。是什么情况呢?我们来看一下:

 

场景:假定pStream中序列化了一个COM对象,我们需要把这个COM对象读取到CComVariant变量vValue中。

1、vValue初始已保存了其他值。如vValue.vt=VT_BOOL; vValue.boolVal=VARIANT_TRUE;

2、ReadFromStream内部先执行vValue.Clear()。 vValue.vt变为VT_EMPTY,  vValue.boolVal值不变。

2、ReadFromStream内部再读取VarType,结果vValue.vt为VT_DISPATCH。

3、ReadFromStream内部再读取COM对象,出现了意外,没有给vValue.pdispVal赋值,所以仍然是vValue.boolVal=VARIANT_TRUE。

4、当return hr时,自动执行vValue的析构方法,调用vValue.Clear()。因为当前vt等于VT_DISPATCH,所以会尝试调用

vValue.pdispVal->Release();  这时,vValue.pdispVal既不是NULL指针,也没有指向一个有效的接口指针。从而导致程序崩溃。

 

所以,更稳妥的代码应该是这样:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值