0

PAnsiChar 型を返すメソッドがあります。Rtti がそれをポインターとして識別していることに気付きました。PAnsiChar として識別する方法はありますか?

Python 拡張機能から文字列を返すための情報が必要であり、Python は void * だけでなく文字列ポインタであることを知る必要があります。Python の Delphi コードは動的に作成されるため、Python インターフェイスに適切なコードを作成できるように、メソッドによって返される型を確認する必要があります。

4

1 に答える 1

2

インスタンスからTRttiType次の操作を行います。

  1. Handleであるプロパティを読み取りますPTypeInfo
  2. であることを確認しKindますtkPointer
  3. 次に、TypeDataどちらがにドリルダウンしPTypeDataます。
  4. RefType次に、 which is type を読み上げますPPTypeInfo
  5. 最後に、ポインターが参照する型が AnsiChar with であることを確認し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 に答える