我有函数(用Delphi 7编写,32位):
Function GetVMTAddr(var C): Integer; Begin Result := Integer(C); Try PVmt(Result)^.SelfPtr := PVmt(C)^.SelfPtr; Except Result := 0; End; End;
返回VMT地址(我认为它是VMT,我不确定)并检查参数是否是一个对象(try...except
,这是一个很糟糕的解决方案)。
我有两个问题:
1)这真的是VMT地址还是我错了?
2)有没有更好的解决方案来检查参数是否为对象?
答案 0 :(得分:10)
如果你传递给它的是一个类引用(a.k.a.是一个元类),那么参数C
将保存一个VMT地址。
您在该功能中检查的条件是无用的。它检查某个内存区域是否可写,这就是全部。如果您检查 SelfPtr
字段是否等于值本身,那么您就更接近了。像这样:
if PVmt(C).SelfPtr = C then
Result := C;
你所问的与几年前在这里提出的问题非常相似,有人想知道how to detect the type of a variable。正如我之前解释的那样,如果你已经达到了认为需要使用此代码的程度,那么你已经遇到了麻烦。返回并更改您的设计,以便知道您是否有类引用或对象引用,而不必猜测。
如果您真的需要猜测,那么您可以尝试使用JCL IsClass
和IsObject
提供的功能。他们做同样的猜测,你的代码试图使用,但他们做得对。