如何在运行时获取接口名称?

4

如果我有一个实现了接口的对象,使用RTTI查找接口并获取其GUID并不太困难。但如果我想要它的名称,有没有办法得到呢?获取类的名称很简单,但对于接口似乎有点棘手...

1个回答

1

难点在于从接口中获取RTTI。如果您已经成功实现了这一点,那么您应该已经在PTypeInfo记录指针中有了名称。

在我的一个程序中,我编写了一个特殊的注册系统,将GUID映射到字符串,以便我可以报告QueryInterface和失败的"as"转换。那是在Delphi 2005中。我的理解是,在后来的Delphi版本中,接口的RTTI已经进步到我可能不再需要那个系统的地步了。


有RTTI,也有RTTI。你可以从TObject.GetInterfaceTable获取一些信息,包括GUID,但那里没有PTypeInfo... - Mason Wheeler
啊,我通常不认为VMT结构中内置的东西是RTTI。撇开术语不谈,你可能会被我提到的单独注册所困扰。如果那时候还没有更好的答案发布,我回家后会检查我的旧代码。 - Rob Kennedy
据我了解,“接口”的“名称”在代码中是可见的,但是在编译时,这些名称会被转换为 GUID,因此信息有些丢失。您需要创建一个类似于Rob建议的注册表来将接口与字符串名称相关联。获取接口实现的方法似乎是可能的(请参见IntfInfo.pas),尽管我从未尝试过这样做。 - skamradt
@Rob:我不太确定你的意思。据我所知,一个类的所有RTTI都嵌入到VMT中的某个位置。例如,用于反序列化表单的元数据是通过偏移量vmtTypeInfo、vmtFieldTable和vmtMethodTable处的指针访问的。 - Mason Wheeler
Paul-Jan,我认为你无法枚举程序中的所有类型信息。实际上,我非常确定编译器甚至不会生成某些类型信息,除非你在程序中某个地方显式地使用了TypeInfo函数来请求它。 - Rob Kennedy
显示剩余2条评论

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