PAnsiChar 型を返すメソッドがあります。Rtti がそれをポインターとして識別していることに気付きました。PAnsiChar として識別する方法はありますか?
Python 拡張機能から文字列を返すための情報が必要であり、Python は void * だけでなく文字列ポインタであることを知る必要があります。Python の Delphi コードは動的に作成されるため、Python インターフェイスに適切なコードを作成できるように、メソッドによって返される型を確認する必要があります。
PAnsiChar 型を返すメソッドがあります。Rtti がそれをポインターとして識別していることに気付きました。PAnsiChar として識別する方法はありますか?
Python 拡張機能から文字列を返すための情報が必要であり、Python は void * だけでなく文字列ポインタであることを知る必要があります。Python の Delphi コードは動的に作成されるため、Python インターフェイスに適切なコードを作成できるように、メソッドによって返される型を確認する必要があります。
インスタンスからTRttiType
次の操作を行います。
Handle
であるプロパティを読み取りますPTypeInfo
。Kind
ますtkPointer
。TypeData
どちらがにドリルダウンしPTypeData
ます。RefType
次に、 which is 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.
出力:
真実 真実 真実