我有一个返回 PAnsiChar 类型的方法。我注意到 Rtti 将其标识为指针。有什么方法可以将其识别为 PAnsiChar 吗?
我需要从 python 扩展返回字符串的信息,python 需要知道它是一个字符串指针,而不仅仅是一个 void *。python 的 Delphi 代码是动态创建的,因此需要检查我的方法返回的类型,以便我可以为 python 接口构造适当的代码。
我有一个返回 PAnsiChar 类型的方法。我注意到 Rtti 将其标识为指针。有什么方法可以将其识别为 PAnsiChar 吗?
我需要从 python 扩展返回字符串的信息,python 需要知道它是一个字符串指针,而不仅仅是一个 void *。python 的 Delphi 代码是动态创建的,因此需要检查我的方法返回的类型,以便我可以为 python 接口构造适当的代码。
从一个TRttiType
实例中,您执行以下操作:
Handle
属性是 a PTypeInfo
。Kind
是tkPointer
.TypeData
哪个是PTypeData
。RefType
which 是 type PPTypeInfo
。RefType^.Kind=tkChar
.像这样把它们放在一起:
function IsPAnsiChar(AType: TRttiType): Boolean;
begin
Result :=(AType.Handle.Kind=tkPointer)
and (AType.Handle.TypeData.RefType^.Kind=tkChar);
end;
这是一个演示程序:
{$APPTYPE CONSOLE}
uses
SysUtils, TypInfo, Rtti;
function IsPAnsiChar(AType: TRttiType): Boolean;
begin
Result :=(AType.Handle.Kind=tkPointer)
and (AType.Handle.TypeData.RefType^.Kind=tkChar);
end;
var
Context: TRttiContext;
type
MyPAnsiChar = ^AnsiChar;
AnsiChar2 = type AnsiChar;
MyPAnsiChar2 = ^AnsiChar2;
begin
Writeln(BoolToStr(IsPAnsiChar(Context.GetType(TypeInfo(PAnsiChar))), True));
Writeln(BoolToStr(IsPAnsiChar(Context.GetType(TypeInfo(MyPAnsiChar))), True));
Writeln(BoolToStr(IsPAnsiChar(Context.GetType(TypeInfo(MyPAnsiChar2))), True));
Readln;
end.
输出:
真的 真的 真的