Delphi 如何检查传递的参数是否为类?
我有一个函数(用Delphi7编写,32位): 函数GetVMTAddr(var C):整数; 开始 结果:=整数(C); 尝试 PVmt(结果)^.SelfPtr:=PVmt(C)^.SelfPtr; 除了 结果:=0; 结束; 结束; 它返回VMT地址(我想它是VMT,我不确定)并检查参数是否是对象(通过Delphi 如何检查传递的参数是否为类?,delphi,class,vmt,Delphi,Class,Vmt,我有一个函数(用Delphi7编写,32位): 函数GetVMTAddr(var C):整数; 开始 结果:=整数(C); 尝试 PVmt(结果)^.SelfPtr:=PVmt(C)^.SelfPtr; 除了 结果:=0; 结束; 结束; 它返回VMT地址(我想它是VMT,我不确定)并检查参数是否是对象(通过try…除了,这是一个糟糕的解决方案)。 我有两个问题: 1) 这真的是VMT地址还是我错了? 2) 是否有更好的解决方案来检查参数是否为对象?如果传递给参数的是类引用(又称元类),则参数C
try…除了,这是一个糟糕的解决方案)。
我有两个问题:
1) 这真的是VMT地址还是我错了?
2) 是否有更好的解决方案来检查参数是否为对象?如果传递给参数的是类引用(又称元类),则参数C
将保存一个VMT地址
在函数中检查的条件无效。它检查某个内存区域是否可写,仅此而已。如果您正在检查SelfPtr
字段是否等于值本身,那么您会更接近。大概是这样的:
if PVmt(C).SelfPtr = C then
Result := C;
你所问的和几年前这里的一个问题非常相似,有人想知道。正如我当时解释的那样,如果您已经到了需要使用此代码的地步,那么您已经有麻烦了。返回并更改您的设计,这样您就可以知道是类引用还是对象引用,而不必猜测
如果您确实需要猜测,那么可以尝试使用JCL提供的函数,IsClass
和IsObject
。他们做的猜测与您的代码尝试使用的猜测相同,但他们做得很对。可能会有帮助。@Ken White:谢谢,我找到了那个问题,但还有第二个问题,我找不到答案。在“不要在家里尝试”类别中有一个有趣的问题。+很多人都喜欢这个问题“如果您已经到了需要使用此代码的地步,那么您已经有麻烦了”…它仍然在猜测中。;-)
if PVmt(C).SelfPtr = C then
Result := C;