我有功能(用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)有没有更好的解决方案来检查参数是否为对象?
Rob*_*edy 10
C如果传递给它的是类引用(也称为元类),则该参数将保存VMT地址.
您在该功能中检查的条件是无用的.它检查某个内存区域是否可写,这就是全部.如果您正在检查该SelfPtr字段是否等于该值本身,那么您就更接近了.像这样的东西:
if PVmt(C).SelfPtr = C then
Result := C;
Run Code Online (Sandbox Code Playgroud)
您所问的与几年前在这里提出的问题非常相似,有人想知道如何检测变量的类型.正如我之前解释的那样,如果你已经达到了认为需要使用此代码的程度,那么你已经遇到了麻烦.返回并更改您的设计,以便您可以知道您是否有类引用或对象引用而不必猜测.
如果你真的需要猜测,那么你可以尝试使用JCL提供的功能,IsClass和IsObject.他们做同样的猜测,你的代码试图使用,但他们做得对.