SAFEARRAY var 类型存储在哪里?

Fum*_*ura 3 com automation safearray

我想了解 SAFEARRAY 的实现。

在我看来,SAFEARRAY 结构中没有用于存储元素类型信息的字段,例如 VT_I4(3) 或 VT_R4(4),但 SafeArrayGetVartype 函数返回正确的类型。

有人在下面的 MSDN 页面上评论说,高字cLocks保持类型信息:MSDN 上的 SAFEARRAY 结构

但是当我通过类型库将 Long 和 Single 数组从 VBA 传递给 DLL 函数时,这些数组的 fFeatures 都是 0x80,cLocks 都是 0,并且 stll SafeArrayGetVartype 可以告诉 VT_I4(3) 和 VT_R4(4)。

Igo*_*nik 5

根据安全数组的创建方式,变体类型可能会在结构之前(从开始的偏移量 -4 处)存储在内存中SAFEARRAYFADF_HAVEVARTYPEflag infFeatures指示该类型是否可用。

类似地,FADF_HAVEIID表示 GUID(请参阅SafeArrayCreateEx)存储在 -16 的偏移量处,并且可以通过SafeArrayGetIID. FADF_HAVEVARTYPEandFADF_HAVEIID永远不会同时出现(因为否则 theVARTYPE和 theGUID会在内存中重叠),但是当它看到相应的特征标志时,它SafeArrayGetVartype足够聪明以合成VT_RECORD,VT_DISPATCHVT_UNKNOWN类型之一。