0

我有一个返回 PAnsiChar 类型的方法。我注意到 Rtti 将其标识为指针。有什么方法可以将其识别为 PAnsiChar 吗?

我需要从 python 扩展返回字符串的信息,python 需要知道它是一个字符串指针,而不仅仅是一个 void *。python 的 Delphi 代码是动态创建的,因此需要检查我的方法返回的类型,以便我可以为 python 接口构造适当的代码。

4

1 回答 1

2

从一个TRttiType实例中,您执行以下操作:

  1. 阅读Handle属性是 a PTypeInfo
  2. 检查KindtkPointer.
  3. 然后向下钻取到TypeData哪个是PTypeData
  4. 然后读出RefTypewhich 是 type PPTypeInfo
  5. 最后检查指针所指的类型是否为 AnsiChar 和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.

输出:

真的
真的
真的
于 2013-06-05T10:45:20.630 回答