gpt4 book ai didi

delphi - 使用Delphi RTTI获取接口(interface)的字符串名称

转载 作者:行者123 更新时间:2023-12-03 14:57:43 25 4
gpt4 key购买 nike

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

最佳答案

是的,您可以获取它,下面显示了使用 IExample 类型如何获取名称。旧的 Delphi 7 RTTI 是通过 TypInfo Unit 完成的。

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 注册表。 Delphi 7中的RTTI可用于获取类型。

下面将采取IExample返回guid。

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

下面是一个示例注册表,它将接口(interface)的 TypeInfo() 映射到它的 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));

关于delphi - 使用Delphi RTTI获取接口(interface)的字符串名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3107583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com