4

我有功能(用 Delphi 7 32 位编写):

函数 GetVMTAddr(var C): 整数;
开始
  结果:=整数(C);
  尝试
    PVmt(结果)^.SelfPtr := PVmt(C)^.SelfPtr;
  除了
    结果:= 0;
  结尾;
结尾;

它返回 VMT 地址(我认为它是 VMT,我不确定)并检查参数是否是一个对象(通过try...except,这是恕我直言的糟糕解决方案)。
我有两个问题:
1)这真的是 VMT 地址还是我错了?
2)有没有更好的解决方案来检查参数是一个对象?

4

1 回答 1

10

C如果您传递给它的是类引用(又名元类),则该参数将保存一个 VMT 地址。

您在函数中检查的条件是无用的。它检查某个内存区域是否可写,仅此而已。如果您正在检查SelfPtr字段是否等于该值本身,那么您会更接近。像这样的东西:

if PVmt(C).SelfPtr = C then
  Result := C;

您要问的问题与几年前在这里提出的问题非常相似,有人想知道如何检测变量的类型。正如我当时解释的那样,如果您认为您需要使用此代码,那么您已经遇到了麻烦。返回并更改您的设计,这样您就可以知道您是否有类引用或对象引用,而不必猜测。

如果你真的要猜,那么你可以尝试使用 JCL 提供的功能,IsClass并且IsObject. 他们做同样的猜测,你的代码试图使用,但他们做对了。

于 2012-08-23T14:05:53.723 回答