如何在运行时获取项目中定义的类列表?

3

我希望能够在TList中加载当前项目的所有类。如果像普通文件一样读取dpr文件,它只会返回字符串。我想获取在dpr文件中定义的所有类及其名称。有人知道如何做到吗?


1
类通常不会在 .dpr 文件中被引用,而是单元。 - David Heffernan
1
“当前项目中的类”是什么意思?如果你的意思是列出编译到可执行文件中的所有类(假设来自你的之前的问题),那么没有这样的列表。您可以使用RegisterClasses或自己的注册方案,例如使用全局TStringList,其中字符串包含类名,对象包含TClass引用。 - Ondrej Kelle
我正在做这个项目。我只是想在这个项目中加入一些动态。 - Jordan Borisov
这是我所知道的唯一方法,因为编译器不会生成所有编译类的列表。如果您正在使用运行时包,则可以枚举导出项,如此处所示。 - Ondrej Kelle
1
您可能需要编辑您的问题,因为它非常不清楚。如果人们理解您的要求,您可能会得到更好的帮助。 - Ondrej Kelle
@TOndrej,对于所有驻留在二进制文件中的类,我会去找Ludovic Dubois(拼写?)提出的“类黑客”建议。 - Premature Optimization
1个回答

6
在Delphi IDE中,所有类都可以在对应的.pas文件生成的.dcu文件中找到。这些.dcu文件具有专有的二进制演变格式,因此不能在IDE之外使用。
在程序执行期间,在exe文件中没有所有现有类的列表。您可以使用RTTI函数(请参见TypInfo.pas和相关文档Embarcadero documentation)检索已知类的信息。因此,在运行时,您只能从给定的类中检索信息:例如,您可以使用anObject.ClassName或anObject.ClassType方法。
但我怀疑您想从项目的源代码中检索定义的所有类。为此,您需要一个源代码解析器,它将从.pas文件中提取逻辑。简而言之,解析器将读取.dpr,然后读取所有必要的.pas文件源代码,解释对象Pascal类型定义,并创建一个单位、类、方法和属性列表。有几个解析器可供选择:例如PasDoc或我们嵌入在SynProject中的版本。

附加说明-详尽列表:如果在编译过程中生成.map文件,则该文本文件将包含可执行文件的所有符号名称,包括类。您将不得不解析它,但不会有太多信息可以处理,因为没有简单的方法来猜测每个符号是类还是记录,例如,或者关于类继承或属性...这个.map旨在执行调试,而不是RTTI。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接