Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何检查传递的参数是否为类?_Delphi_Class_Vmt - Fatal编程技术网

Delphi 如何检查传递的参数是否为类?

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

我有一个函数(用Delphi7编写,32位):

函数GetVMTAddr(var C):整数; 开始 结果:=整数(C); 尝试 PVmt(结果)^.SelfPtr:=PVmt(C)^.SelfPtr; 除了 结果:=0; 结束; 结束; 它返回VMT地址(我想它是VMT,我不确定)并检查参数是否是对象(通过
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;