我使用了一些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并将未初始化的指针传递给它。

如果您想要一个包含空CComVariantIUnknown*,则可以执行以下操作:

CComVariant variant( static_cast<IUnknown*>( 0 ) ); // null IUnknown*, VT_UNKNOWN type

现在构造一个CComQIPtr是完全合法的:
CComQIPtr<IWhatever> whatever( variant.punkVal ); //punknVal is null - legal

08-16 21:33