delphi – 如何检查传递的参数是否为class?

delphi – 如何检查传递的参数是否为class?,第1张

概述我有功能(用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, 我有功能(用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,我不确定)并检查参数是否是一个对象(通过尝试…除外,这是非常糟糕的解决方案).
我有两个问题:
1)这真的是VMT地址还是我错了?
2)有没有更好的解决方案来检查参数是否为对象?

解决方法 如果传递给它的是类引用(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提供的函数.他们做同样的猜测,你的代码试图使用,但他们做得对.

总结

以上是内存溢出为你收集整理的delphi – 如何检查传递的参数是否为class?全部内容,希望文章能够帮你解决delphi – 如何检查传递的参数是否为class?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1268788.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存