Ian*_*oyd 8 delphi rtti delphi-5
是否正在运行时,查找从特定基类下降的所有类?
例如,假装有一个类:
TLocalization = class(TObject)
...
public
function GetLanguageName: string;
end;
Run Code Online (Sandbox Code Playgroud)
或者假装有一堂课:
TTestCase = class(TObject)
...
public
procedure Run; virtual;
end;
Run Code Online (Sandbox Code Playgroud)
或者假装有一堂课:
TPlugIn = class(TObject)
...
public
procedure Execute; virtual;
end;
Run Code Online (Sandbox Code Playgroud)
或者假装有一堂课:
TTheClassImInterestedIn = class(TObject)
...
public
procedure Something;
end;
Run Code Online (Sandbox Code Playgroud)
在运行时,我想找到所有下降的类,TTestCase以便我可以使用它们.
是否可以查询RTTI以获取此类信息?
或者:德尔福有没有办法让每个班级走路?然后我可以简单地打电话:
RunClass: TClass;
if (RunClass is TTestCase) then
begin
TTestCase(RunClass).Something;
end;
Run Code Online (Sandbox Code Playgroud)
Mas*_*ler 10
它可以使用RTTI完成,但不能在Delphi 5中完成.为了找到符合特定条件的所有类,首先需要能够找到所有类,并且在Delphi 2010中引入了执行此操作所需的RTTI API.你会这样做:
function FindAllDescendantsOf(basetype: TClass): TList<TClass>;
var
ctx: TRttiContext;
lType: TRttiType;
begin
result := TList<TClass>.Create;
ctx := TRttiContext.Create;
for lType in ctx.GetTypes do
if (lType is TRttiInstanceType) and
(TRttiInstanceType(lType).MetaclassType.InheritsFrom(basetype)) then
result.add(TRttiInstanceType(lType).MetaclassType);
end;
Run Code Online (Sandbox Code Playgroud)
嗯,是的,有一种方法,但你不会喜欢它.(显然,我需要这样一个免责声明,以防止我的其他完全有帮助的评论被那些知识渊博的,但不那么宽容的'高级'SO成员所淹没.)
仅供参考:以下描述是我在Delphi 5最新和最好的时候实际编写的一段代码的高级概述.从那时起,该代码被移植到更新的Delphi版本(目前直到Delphi 2010)并且仍然有效!
对于初学者,您需要知道一个类只不过是VMT和附带函数的组合(可能还有一些类型信息,具体取决于编译器版本和设置).您可能知道,类(由TClass类型标识)只是指向该类VMT的内存地址的指针.换句话说:如果您知道类的VMT的地址,那么它也是TClass指针.
有了这条知识牢记在你的脑海中,你实际上可以扫描你的可执行内存,并为每个地址测试它是否看起来像'VMT.所有似乎是VMT的地址都可以添加到列表中,从而可以完整地概述可执行文件中包含的所有类!(实际上,这甚至可以让您访问仅在单元的实现部分中声明的类,以及从作为二进制文件分发的组件和库链接的类!)
当然,有些地址似乎是一个有效的VMT,但实际上是一些随机的其他数据(或代码) - 但是通过我提出的测试,这在我身上从未发生过(大约6年)在十多个积极维护的应用程序中运行此代码).
所以这是你应该做的检查(按照这个确切的顺序!):
如果所有这些检查都成立,则测试地址是有效的VMT(就我而言)并且可以添加到列表中.
祝你好好实现这一切,我花了大约一个星期来做到这一点.
请告诉你它是如何工作的.干杯!
| 归档时间: |
|
| 查看次数: |
5518 次 |
| 最近记录: |