Delphi 有没有办法用Rtti来识别PAnsiChar?
我有一个返回PAnsiChar类型的方法。我注意到Rtti将其标识为指针。有没有办法把它确定为一辆泛七彩车Delphi 有没有办法用Rtti来识别PAnsiChar?,delphi,Delphi,我有一个返回PAnsiChar类型的方法。我注意到Rtti将其标识为指针。有没有办法把它确定为一辆泛七彩车 我需要从python扩展返回字符串的信息,python需要知道它是一个字符串指针,而不仅仅是一个void*。python的Delphi代码是动态创建的,因此需要检查我的方法返回的类型,以便为python接口构造适当的代码。从TRttiType实例执行以下操作: 阅读Handle属性,该属性是PTypeInfo 检查Kind是否为tkPointer 然后向下钻取到TypeData,即PTyp
我需要从python扩展返回字符串的信息,python需要知道它是一个字符串指针,而不仅仅是一个void*。python的Delphi代码是动态创建的,因此需要检查我的方法返回的类型,以便为python接口构造适当的代码。从
TRttiType
实例执行以下操作:
Handle
属性,该属性是PTypeInfo
Kind
是否为tkPointer
李>
TypeData
,即PTypeData
李>
RefType
,即类型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.
输出:
True
True
True
真的
真的
真的
没有,但你问错问题了。与其说“我能找到一种使用RTTI解决问题的方法吗?”,不如说“我有一个问题……我怎么能……?”,然后问这个问题的解决方案。不要完全遵循,你是说不要使用RTTI解决这个问题,而是重新设计我的方法,这样我就不需要RTTI了?我是说RTTI不是唯一的选择,也许还有更好的。但是,您的问题仅限于RTTI,没有要求更好的解决方案(或者提供足够的细节供任何人提供)。你已经束缚了你(和我们)的手脚。(我认为RTTI无论如何都不能识别
PAnsiChar
,因为它是一个通用指针,恰好指向以null结尾的AnsiChar
缓冲区,我认为即使在最近版本的Delphi中对RTTI进行了增强,也没有任何RTTI与之相关。),看来我需要想别的办法。上下文如下。dll公开了一个反映内部对象模型的API(都是用Delphi编写的)。还公开了一组简单的Rtti方法,允许dll用户了解导出方法的详细信息。另一个Delphi程序加载dll并生成Delphi编写的python扩展PAnsiChar@rhody这个答案对你有用吗。一些反馈会很好。更重要的是,您是否注意到此处对您的公认答案的讨论: