当我使用VBA的VarType 功能时,将mscorlib.dll库引用(.NET库引用)中Object可用的类的实例传递给它,返回的值为。8
根据此处的 VBA文档,这意味着该对象是字符串。这似乎很荒谬。
我的问题是,为什么VarType函数Object从.NET库VBA参考返回此类的实例的字符串类型值?是虫子吗?
我怀疑VBA的VarType功能在说某个COM对象是一个字符串,这可能是为什么我在DispCallFunc某些COM对象的某些方法上使用该函数时遇到问题的原因。COM对象是.NET对象的COM版本,可通过.NET框架使用。
我正在使用mscorlib.dll VBA参考来获取这些对象的早期绑定功能。该参考引用.NET框架的版本4.0.30319。在我的计算机上,引用的类型库存储在:
C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ mscorlib.tlb。
它看上去就像当对象的方法指定一个参数或返回值是类型的System.Object,DispCallFunc没有为我工作。无论如何,这是一个单独的问题,与该问题专用于该问题的情况密切相关。
当我将VarType函数与mscorlib.dll库中其他类的实例一起使用时,有时会得到9&13(VbVarType.vbObject&VbVarType.vbDataObject常数)的返回值,这似乎是正确的。
我在互联网上进行了调查,看看是否有人遇到了问题,但找不到任何东西。
Dim o As mscorlib.Object
Set o = New mscorlib.Object
Debug.Print "TypeName(o) = " & TypeName(o) ' TypeName function seems to work correctly.
Debug.Print …Run Code Online (Sandbox Code Playgroud) 在为某个对象类型声明了一个数组(其中该类型不使用从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类型库。
关于使用不源自的接口的对象类型的更多信息 …