我使用了一些CComVariant类型变量来存储接口(interface)指针,但是有时候我需要将接口(interface)指针作为NULL传递,在这种情况下,我需要这样做:
CComVariant vAData,vBData;
......
....
CComQIPtr<IBData> pAData = vAData.punkVal; //vAData is {0, VT_I4} when I pass NULL
CComQIPtr<IBData>pBData = vBData.punkVal; //vBData is {0, VT_I4} when I pass NULL
由于
vAData.punkVal = 0xffffffff00000000
,第一行失败并引发异常但是第二行正常进行,没有错误,并且它具有有效的
vBData.punkVal
值(0x0000000000000000)。我想知道为什么当两个都是NULL时两个punkVal是不同的吗?
有谁知道为什么会这样吗?
这仅在64位计算机上引发异常。
最佳答案
CComVariant
在构造函数中调用VariantInit()
,并将vt
设置为VT_EMPTY
,但保留punkVal
未初始化(不使其为null)。
因此,您尝试执行的操作是未定义的行为,因为您尝试构造一个CComQIPtr
并将未初始化的指针传递给它。
如果您想要一个包含空CComVariant
的IUnknown*
,则可以执行以下操作:
CComVariant variant( static_cast<IUnknown*>( 0 ) ); // null IUnknown*, VT_UNKNOWN type
现在构造一个
CComQIPtr
是完全合法的:CComQIPtr<IWhatever> whatever( variant.punkVal ); //punknVal is null - legal