首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Delphi RTTI获取接口的字符串名称

使用Delphi RTTI获取接口的字符串名称
EN

Stack Overflow用户
提问于 2010-06-24 14:11:25
回答 2查看 3.6K关注 0票数 6

我已经证明了我可以使用Delphi2010从GUID中获取接口的名称(例如IMyInterface转换为字符串'IMyInterface‘)。我想在Delphi 7中实现这一点(为了兼容性)。这个是可能的吗?或者有基本的编译器限制。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-24 17:10:15

是的,你可以获取它,下面展示了如何使用IExample类型来获取名称。旧的Delphi7RTTI是通过TypInfo单元完成的。

代码语言:javascript
复制
program Project6;
{$APPTYPE CONSOLE}
uses
  SysUtils,TypInfo;

type
  IExample = interface
    ['{4902F666-F3FC-4999-BD8C-F226851201D6}']
    procedure blah;
  end;


begin
  Writeln(GetTypeName(TypeInfo(IExample)));
  readln
end.

我注意到你说你想从GUID中获取它,而不仅仅是类型。这将需要一个GUID到类型的注册表。Delphi7中的RTTI可以用来获取类型。

下面的代码会让IExample返回guid。

代码语言:javascript
复制
Writeln(GUIDToString(GetTypeData(TypeInfo(IExample)).Guid));

下面是一个示例注册表,它将接口的TypeInfo()映射到它的GUID。它可以被优化,但我这样做是为了说明这个概念。

代码语言:javascript
复制
unit Unit11;

interface
uses
  TypInfo,SysUtils, Contnrs;

type

  TGuidMap = class(TObject)
    Guid : TGUID;
    TypeInfo : PTypeInfo;
  end;

procedure RegisterInterface(InterfaceType : PTypeInfo);

function GetInterfaceType(Guid : TGUID) : PTypeInfo;

implementation
var
  GuidMapList : TObjectList;

procedure RegisterInterface(InterfaceType : PTypeInfo);
var
 Map : TGuidMap;
begin
  Map := TGuidMap.Create;
  Map.TypeInfo := InterfaceType;
  Map.Guid := GetTypeData(InterfaceType).Guid;
  GuidMapList.Add(Map);
end;

function GetInterfaceType(Guid : TGUID) : PTypeInfo;
var
 I : Integer;
begin
 result := nil;
 for I := 0 to GuidMapList.Count - 1 do
 begin
   if IsEqualGUID(TGuidMap(GuidMapList.Items[I]).Guid,Guid) then
   begin
     result := TGuidMap(GuidMapList.Items[I]).TypeInfo;
     break;
   end;
 end;
end;

Initialization
 GuidMapList := TObjectList.Create(true);
finalization
 GuidMapList.Free;
end.

若要将项添加到注册表中,则需要调用

代码语言:javascript
复制
   RegisterInterface(TypeInfo(IExample));
票数 10
EN

Stack Overflow用户

发布于 2010-06-24 15:05:30

在Delphi7中,您应该构建自己的从GUID到RTTI (或名称)的映射。THere不像在Delphi2010中那样是RTTI上下文。我广泛地使用RIIT,通常会在单元的初始化部分集中“注册”所有有趣的类型,并根据typeinfo指针从那里找到所有类型。这适用于D7、D2007和D2010 (但如果您需要创建它,则需要做更多的工作)。此外,您可能会忘记注册一个类型,并想知道为什么找不到某些类型。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3107583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档