Mar*_*des 5 arrays com vba ole-automation iunknown
在为某个对象类型声明了一个数组(其中该类型不使用从COM的接口派生的接口(&因此未正确设置以启用[OLE] Automation的后期绑定技术))后,尝试根据我的期望将数组分配给变量不起作用。IDispatchVariant
具体而言,似乎发生的情况是将指向数组的积分指针分配给了Variant变量,而不是数组的副本。
谁能解释这种行为?这是VBA 7.1语言的标准行为吗?[EDIT-A1]是VBA的Variant类型不能处理此类数组吗?[EDIT-A2]
[EDIT-A1]- 当前(19年4月6日),看起来像是个错误。
[EDIT-A2]- 否,因为ByRef Variant如果将这样的数组作为此类参数的值传递,则参数的内部过程参数可以正确指向此类数组。
有关正在发生的事情的更多详细信息
在检查了各种内存地址和指针之后,似乎正在发生的事情是,在将此类数组分配给Variant变量时,实际上是分配了指向数组“ VB安全数组指针”的Long(或LongPtr)指针。这与VBA语言规范中此处记录的预期的行为相反。在查看有关VB数组及其内存布局的VB6文档(存储在此处)之后,我推断出发生了这种指针分配。
我对问题是否先前已被记录的研究
我搜索了Internet,Office VBA参考文档和VBA语言规范,以查看是否有人记录了此问题。我发现该问题可能已被部分记录的唯一地方是在此处发布的堆栈溢出答案中。不幸的是,该帖子没有对这个问题说太多。
我测试过的特定数组类型
我曾经历过与使用接口不下列对象类型的数组这个问题获得来自IDispatch:
stdole.IUnknown *stdole.IFontmscoree.CorRuntimeHost †mscorlib.AppDomain †mscorlib.Type*来自的OLE Automation COM类型库stdole2.tlb。
†来自.NET Framework v4.0.30319的COM类型库。
关于使用不源自的接口的对象类型的更多信息IDispatch是
这样的对象类型是vbDataObject类型。不幸的是,当前的VBA文档中的vbDataObject常量是不准确的。我正在更新文档,并且您可以在此处查看有关常量的更新定义。
[编辑-COM规范链接已删除,因为它不再相关。]
关于其他对象类型的数组
vbObject类型数组(支持[OLE]自动化后期绑定技术的COM对象类型)似乎已经以Variant一种直接和预期的方式分配给变量- 复制并直接分配了数组。
使用VBE手表检查此类阵列时,VBE曾经崩溃
一个潜在的相关问题与一个错误有关,该错误曾经在将VBE 监视表达式放置在使用不从其派生的接口的类型的数组上时发生IDispatch。该错误曾经导致VBE意外崩溃。该错误似乎已由Microsoft在上个月内修复。
软件版本
软件 | 版本 ------------------------- + ---------------
VBA | 7.1 ‡
------------------------- + ---------------
Microsoft Excel | 2016年§
------------------------- + ---------------
Microsoft Windows(OS)| 8.1 ¶
•版本的全文为“零售7.1.1088”(最新版本)。
§更具体地说,是最新版本和内部版本(于2019年6月3日发布,版本1905,内部版本11629.20214),以及更早的内部版本号11629.20196和11601.20204(首次于2019年5月14日发布)。
¶ ver.exe程序显示“ Microsoft Windows [Version 6.3.9600]”。
Software | Version -------------------------+---------------
VBA | 7.1 ‡
-------------------------+---------------
Microsoft Excel | 2016 §
-------------------------+---------------
Microsoft Windows (OS) | 8.1 ¶
我希望MyVariant存储MyArray阵列的副本。
而是在VBA的32位版本中,MyVariant存储一个Long似乎是的指针的值MyArray。
单击此处 获取VBA代码以帮助调试问题。
| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |