com - SAFEARRAY var 类型存储在哪里?

标签 com automation safearray

我想了解 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_HAVEVARTYPEFADF_HAVEIID 永远不能同时存在(因为否则 VARTYPEGUID 会在内存中重叠),但是 SafeArrayGetVartype 足够聪明,可以在看到相应的功能标志时合成 VT_RECORDVT_DISPATCHVT_UNKNOWN 类型之一。

关于com - SAFEARRAY var 类型存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18784470/

相关文章:

com - 如何读取 winmd(WinRT 元数据文件)?

.net - CLR 如何实现 COM 实现的二进制级别的互操作性?或者不?

C++ 接口(interface)的 .NET 实现,暴露给 COM

c++ - 我如何在 XLOPER 和 VARIANT 之间编码?

c# - 将字符串数组从 COM 传递到 C#

c# - 使 COM 互操作事件从界面可见

c++ - 在自动化服务部署时设置用户服务运行的最佳实践是什么?

javascript - 没有名称或 ID 的 Selenium 单击按钮

regex - 如何使用 Regexp 检索链接文本在括号中有数字的 URL

c# - 将自定义类型的 Safearray 从 C++ 传递到 C#