在序列化与反序列化中,我们经常使用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指针,也没有指向一个有效的接口指针。从而导致程序崩溃。
所以,更稳妥的代码应该是这样: