gpt4 book ai didi

VB6 对象和数据类型

转载 作者:行者123 更新时间:2023-12-04 13:28:29 25 4
gpt4 key购买 nike

我知道 Object 类在面向对象的编程语言(如 Java)中位于类层次结构的顶部。我还了解到您在 .NET 中有引用类型和值类型。我也理解基于 C 语言的类型定义。

尽管如此;我正在努力理解 VB6 中的对象是什么(
http://msdn.microsoft.com/en-us/library/aa338034%28v=vs.60%29.aspx
) 以及究竟是什么变体。什么是变体?以及如何在 VB6 中实现对象?

最佳答案

VB6 使用的所有对象都是 COM 对象。 COM 对象本质上是一个可变长度数据结构,其可变长度头包含任意数量的指向 VTable 的 32 位指针,而连续字节包含对象的实例数据。例如,

Bytes
0-3 VTable1 pointer
4-7 VTable2 pointer
8-11 VTable3 pointer
...
Instance data

VTable 是一个由 32 位指针组成的数组,指向函数,所有这些函数都被传递一个“this”实例指针。
Bytes
0-3 Func1(this, ..., ...)
4-7 Func2(this, ..., ...)
8-11 Func3(this, ..., ...)
...

唯一的其他规范是所有 VTable 必须从 IUnknown 继承,即前三个函数必须是:
QueryInterface()
AddRef()
Release()

本质上,QueryInterface() 允许您查明 COM 对象是否支持特定接口(interface)(由 UUID 表示)。 AddRef() 允许对象编写器增加内部引用计数。 Release() 允许对象写入器减少引用计数器,当计数为零时销毁对象。您永远不会在 VB 中调用这些方法 - 编译器会为您添加这些调用(VB6 的优点之一)。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms680509(v=vs.85).aspx更多细节。

VB 'Object' 类型是对支持 IDispatch 接口(interface)的对象的引用(参见 http://msdn.microsoft.com/en-us/library/windows/desktop/dd318520(v=vs.85).aspx)。这就是允许您在 VB 和 VBScript 中进行后期绑定(bind)的原因。用 VB6 编写的所有对象都会自动实现从 IDispatch 继承的接口(interface)。这称为双接口(interface),因为它支持早期和后期绑定(bind)。

请注意,COM 中没有内置直接类型系统。但是,您可以选择支持 ITypeInfo 接口(interface),它允许您的对象的用户访问您想要添加的有关对象的信息(使用使用类型库来存储此信息的默认实现更容易)。

正如 Bob Riemersma 所提到的,Variant 类型实际上是一个 16 字节的结构,它有一个 2 字节的整数 (vt),表示封装了什么自动化类型,后 8 个字节可用于包含最多 8 个值类型字节,或指向另一种类型的 32 位指针。 VB 使用其内部函数在 VB 类型和 Variants 之间进行所有必要的转换,以及所有必要的内存分配和释放。通过将指向对象的指针复制到 Variant 中并调用对象的 AddRef() 方法,变体可以包含对 COM 对象的引用。

关于VB6 对象和数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10096040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com