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

Delphi 如何在运行时获取接口的名称?,delphi,interface,rtti,Delphi,Interface,Rtti,如果我有一个实现接口的对象,那么使用RTTI查找接口并获取其GUID并不太困难。但是如果我想知道它的名字,有没有办法得到它?获取类的名称非常简单,但对于接口来说似乎有点棘手…棘手的部分是从接口获取RTTI。如果您成功地做到了这一点,那么您应该已经在PTypeInfo记录指针中有了该名称 在我的一个程序中,我编写了一个特殊的注册系统,将guid映射到字符串,这样我就可以将失败的调用报告给QueryInterface,并将失败的“作为”强制转换。那是在德尔福2005年。我的理解是,在后来的Delph

如果我有一个实现接口的对象,那么使用RTTI查找接口并获取其GUID并不太困难。但是如果我想知道它的名字,有没有办法得到它?获取类的名称非常简单,但对于接口来说似乎有点棘手…

棘手的部分是从接口获取RTTI。如果您成功地做到了这一点,那么您应该已经在
PTypeInfo
记录指针中有了该名称


在我的一个程序中,我编写了一个特殊的注册系统,将guid映射到字符串,这样我就可以将失败的调用报告给
QueryInterface
,并将失败的“
作为
”强制转换。那是在德尔福2005年。我的理解是,在后来的Delphi版本中,接口的RTTI已经发展到我可能不再需要该系统。

有RTTI,然后是RTTI。您可以从TObject.GetInterfaceTable获得一些信息,包括一个GUID,但是那里没有PTypeInfo…啊。我一般不考虑在VMT结构中构建的东西是RTTI。撇开术语不谈,您可能会被我提到的单独注册所困扰。如果到那时还没有更好的答案,我会在回家后查看我的旧代码。据我所知,接口的“名称”在代码中是可见的,但在编译时,名称会被转换为guid,因此信息会有所丢失。您必须创建一个注册表,就像Rob建议的那样,将接口与字符串名称关联起来。获取由接口实现的方法似乎是可能的(请参见IntfInfo.pas),尽管我从未尝试过这种方法。@Rob:我不太清楚你的意思。据我所知,一个类的所有RTTI都构建在VMT的某个地方。例如,用于反序列化表单的元数据通过偏移量vmtTypeInfo、vmtFieldTable和vmtMethodTable处的指针进行访问。@Rob:名称和GUID都包含在PTypeInfo中。如果您能够以某种方式枚举所有typeinfo结构,那么您可以自动生成映射。这似乎并不比从接口(实例)获取PTypeInfo更容易,但仍然是::-)