【问题标题】:Delphi Rtti with Ios 64 Bits带 Ios 64 位的 Delphi Rtti
【发布时间】:2016-05-24 02:58:27
【问题描述】:

我有以下代码,在 Delphi Berlin (10.1) 的新项目中创建:

Procedure Test;
var
 vRttiContext : TRttiContext;
 vPackages : TArray<TRttiPackage>;
 vTypes : Tarray<TRttiType>;
 vType : TRttiType;
 vPackage : TRttiPackage;
begin
 vRttiContext:=TRttiContext.Create;
 vPackages:=vRttiContext.GetPackages;
 if (vPackages<>nil) then
  for vPackage in vPackages do
   begin
    vTypes:=vPackage.GetTypes;
    case vtype.TypeKind of
     tkClass : ; //DoSomething
    end;
  end;
end;

此代码在 Win32 / Win64、Ios32 位下完美运行, 但不是 IOS64。

使用 Ios64 位,我在该行中遇到访问冲突:

vType:=vPackage.GetTypes

当然,我在编译选项中添加了“发出 RTTI 信息”。

【问题讨论】:

  • 我看不出这段代码是如何工作的,因为您在访问vType TypeKind 之前没有为vType 分配任何东西。你错过了第二个for 循环。
  • 你的if也不需要
  • 我在复制此消息的代码时忘记了一行。但事实是,代码无论如何都会在“vTypes=vPackage.getTypes”行(在使用 vType 之前)创建访问冲突。

标签: ios delphi 64-bit rtti delphi-10.1-berlin


【解决方案1】:

我终于找到了问题。问题是以下代码:

  wurRecDouble = packed record
  case byte of
   0 : (Value : Double);
   1 : (Bytes: array [0..7] of Byte);
  end;

在 Ios 64 位下,RTTI 信息处于活动状态,行

vTypes:=vPackage.GetTypes;

(参见前面的代码)将生成一个 A/V(明显为零)

如果我将 Value 的类型更改为 Int64,例如 A/V 就会消失。

此外,理论上 Delphi 不会为记录发出 RTTI 信息,那么为什么要使用带有记录的 A/V 呢?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 2010-09-15
    • 2011-11-22
    • 1970-01-01
    • 2012-09-22
    • 2011-04-27
    • 1970-01-01
    相关资源
    最近更新 更多