我想了解 SAFEARRAY 的实现。
在我看来,SAFEARRAY 结构中没有用于存储元素类型信息的字段,例如 VT_I4(3) 或 VT_R4(4),但 SafeArrayGetVartype 函数返回正确的类型。
有人在下面的 MSDN 页面上评论说 cLocks
的高位字包含类型信息:SAFEARRAY structure on MSDN
但是当我通过类型库将 Long 和 Single 数组从 VBA 传递到 DLL 函数时,这些数组的 fFeatures 都是 0x80,cLocks 都是 0,并且 STLl SafeArrayGetVartype 可以告诉 VT_I4(3) 和 VT_R4(4)。
最佳答案
根据安全数组的创建方式,变体类型可能会存储在内存中,位于 SAFEARRAY
结构之前(从开始的偏移量 -4 处)。 fFeatures
中的 FADF_HAVEVARTYPE
标志表示该类型是否可用。
同样,FADF_HAVEIID
表示 GUID(参见 SafeArrayCreateEx
)存储在偏移量 -16 处,可通过 SafeArrayGetIID
获得。 FADF_HAVEVARTYPE
和 FADF_HAVEIID
永远不能同时存在(因为否则 VARTYPE
和 GUID
会在内存中重叠),但是 SafeArrayGetVartype
足够聪明,可以在看到相应的功能标志时合成 VT_RECORD
、VT_DISPATCH
或 VT_UNKNOWN
类型之一。
关于com - SAFEARRAY var 类型存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18784470/