Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 有没有办法用Rtti来识别PAnsiChar?_Delphi - Fatal编程技术网

Delphi 有没有办法用Rtti来识别PAnsiChar?

Delphi 有没有办法用Rtti来识别PAnsiChar?,delphi,Delphi,我有一个返回PAnsiChar类型的方法。我注意到Rtti将其标识为指针。有没有办法把它确定为一辆泛七彩车 我需要从python扩展返回字符串的信息,python需要知道它是一个字符串指针,而不仅仅是一个void*。python的Delphi代码是动态创建的,因此需要检查我的方法返回的类型,以便为python接口构造适当的代码。从TRttiType实例执行以下操作: 阅读Handle属性,该属性是PTypeInfo 检查Kind是否为tkPointer 然后向下钻取到TypeData,即PTyp

我有一个返回PAnsiChar类型的方法。我注意到Rtti将其标识为指针。有没有办法把它确定为一辆泛七彩车


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

TRttiType
实例执行以下操作:

  • 阅读
    Handle
    属性,该属性是
    PTypeInfo
  • 检查
    Kind
    是否为
    tkPointer
  • 然后向下钻取到
    TypeData
    ,即
    PTypeData
  • 然后读取
    RefType
    ,即类型
    PPTypeInfo
  • 最后检查指针引用的类型是否为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.
    
    输出:

    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这个答案对你有用吗。一些反馈会很好。更重要的是,您是否注意到此处对您的公认答案的讨论: