gpt4 book ai didi

delphi - 如何检查传递的参数是否是类?

转载 作者:行者123 更新时间:2023-12-03 15:20:15 27 4
gpt4 key购买 nike

我有函数(用 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,这是恕我直言的糟糕解决方案)。< br/>我有两个问题:
1)这真的是VMT地址还是我错了?
2)是否有更好的解决方案来检查参数是否为对象?

最佳答案

如果您传递给参数 C 的是类引用(也称为元类),则参数 C 将保存 VMT 地址。

您在函数中检查的条件没有用。它检查某个内存区域是否可写,仅此而已。如果您检查SelfPtr 字段是否等于值本身,那么您会更接近。像这样的事情:

if PVmt(C).SelfPtr = C then
Result := C;

您所问的问题与几年前在这里提出的问题非常相似,当时有人想知道 how to detect the type of a variable 。正如我当时所解释的,如果您认为需要使用此代码,那么您已经遇到麻烦了。返回并更改您的设计,以便您可以知道是否有类引用或对象引用,而不必猜测。

如果你确实需要猜测,那么你可以尝试使用JCL提供的函数,IsClassIsObject。他们会进行与您的代码尝试使用的相同的猜测,但他们做得正确。

关于delphi - 如何检查传递的参数是否是类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12093176/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com