- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
System.pas 文件包含大量有关硬编码 VMT 偏移量的信息,但它似乎并没有真正说明 VMT 本身的结构。我真正想知道的是,有没有办法在运行时找出 VMT 的大小,或者换句话说,给定类存在多少个虚拟方法?
最佳答案
您想了解 VMT 结构吗?您还知道,这是一个内部实现细节,可能会发生变化(并且随着时间的推移而发生变化)。
为了回答您的具体问题,以下是查找给定类的虚拟方法数量的简单方法:
function GetVirtualMethodCount(AClass: TClass): Integer;
begin
Result := (PInteger(Integer(AClass) + vmtClassName)^ -
(Integer(AClass) + vmtParent) - SizeOf(Pointer)) div SizeOf(Pointer);
end;
这是有效的,因为我碰巧知道表示类名的字符串紧跟在 VMT 中的所有虚拟方法向量之后。
我还知道所有 TObject 上有 11 个虚拟方法(对于 D2009,对于 D2007 及更早版本有 9 个),它们与 VMT 指针本身负偏移。
这就是 vmtParent 引用的原因。
最后,通过使用 TClass 类引用,您可以将任何 TObject 派生类传递到此函数中并获取虚拟方法的数量。
关于delphi - 在哪里可以找到有关 Delphi VMT 结构的信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/760513/
使用 Visual C++ 编译器,每个类对象都有 VMT(对象中的第一个指针),它是指向类中每个方法的指针数组的指针。使用这样的代码: TestObject * object = new TestO
System.pas 文件包含大量有关硬编码 VMT 偏移量的信息,但它似乎并没有真正说明 VMT 本身的结构。我真正想知道的是,有没有办法在运行时找出 VMT 的大小,或者换句话说,给定类存在多少个
语境: 我正在尝试使用 Delphi 应用程序中的一些 COM 接口(interface)(Direct2D 1.1)。为此,我必须将接口(interface)移植到 Delphi。我已经这样做了,但
我需要从 Delphi 调用一些 C++ 代码。作为返回,C++ 代码需要能够回调到 Delphi 代码中。此处显示的示例 Calling a callback function in Delphi
据我所知here , the VMT also contains a number of “magic” fields to support features such as parent class
我是一名优秀的程序员,十分优秀!