代码之家  ›  专栏  ›  技术社区  ›  Brian Frost

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

  •  6
  • Brian Frost  · 技术社区  · 14 年前

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

    2 回复  |  直到 14 年前
        1
  •  10
  •   Robert Love    14 年前

    是的,您可以得到它,下面展示了如何使用IExample类型获得名称。 旧的delphi7rtti是通过TypInfo单元完成的。

    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可以用来获取类型。

    下面将以返回guid为例。

    Writeln(GUIDToString(GetTypeData(TypeInfo(IExample)).Guid));
    

    它可以优化,但我这样做是为了说明这个概念。

    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.
    

    向注册表中添加一个项,然后调用

       RegisterInterface(TypeInfo(IExample));
    
        2
  •  3
  •   Ritsaert Hornstra    14 年前