我应该如何为最终的 64 位编译器准备 32 位 Delphi 程序? [复制]

2024-02-18

可能的重复:
迁移到 Delphi 2010 和 Unicode 时如何为 64 位做好准备 https://stackoverflow.com/questions/1568685/how-to-also-prepare-for-64-bits-when-migrating-to-delphi-2010-and-unicode

既然我相信64bitDelphi编译器即将出现, 我很好奇是否有人知道什么样的程序 现在就是32bit将编译并运行,无需任何更改 使用时64bit编译器。

如果有一个一般规则,我们应该做出什么样的改变 系统地编译我们的旧程序 作为64bit?

做好准备是件好事64bit编译器会突然出现在这里......

任何建议将不胜感激。


首先,免责声明:虽然我在 Embarcadero 工作。我不能代表我的雇主说话。我将要写的内容是基于我自己对假设的 64 位 Delphi 应如何工作的看法,但可能存在也可能不存在相互竞争的意见以及其他可预见或不可预见的不兼容性和事件,从而导致做出替代设计决策。

那是说:

  • 有两种整数类型,NativeInt 和 NativeUInt,它们的大小将 根据平台在 32 位和 64 位之间浮动。他们曾经 周围有相当多的版本。其他整数类型不会改变大小 取决于目标的位数。

  • 确保任何依赖于将指针值转换为 整数或反之亦然是使用 NativeInt 或 NativeUInt 作为整数 类型。在 Delphi 的更高版本中,TComponent.Tag 应该是 NativeInt。

  • 我建议不要将 NativeInt 或 NativeUInt 用于非基于指针的值。尝试使您的代码在 32 位和 64 位之间保持语义相同。如果需要 32 位范围,请使用 Integer;如果需要 64 位,请使用 Int64。这样您的代码应该在两个位数上运行相同。仅当您要在某种类型的指针值(例如引用或 THandle)之间进行转换时,才应使用 NativeInt。

  • Use PByte对于指针算术,在可能的情况下,优先于NativeInt or NativeUInt。它足以满足大多数用途,并且更加类型安全,因为它不会(轻易)被误认为是普通整数类型,反之亦然。

  • 类似指针的东西应该遵循与指针类似的规则:对象 引用(显然),还有 HWND、THandle 等。

  • 不要依赖字符串和动态数组的内部细节,例如 他们的头数据。

  • 我们对 64 位 API 更改的一般政策应该是保持 尽可能在 32 位和 64 位之间使用相同的 API,即使这意味着 64位API不一定能利用机器。为了 例如,TL​​ist 可能只处理 MaxInt div SizeOf(Pointer) 元素,以便将计数、索引等保持为整数。因为 整数类型不会浮动(即根据位数改变大小),我们 不希望对客户代码产生连锁反应:任何索引 通过整数类型变量或 for 循环索引进行往返, 会被截断并可能导致微妙的错误。

  • 当 API 扩展为 64 位时,它们很可能会通过 一个额外的函数/方法/属性来访问额外的数据,这 32 位也将支持 API。例如,Length() 标准 例程可能会返回 Integer 类型的值作为参数 类型字符串或动态数组;如果一个人想要处理非常大的 动态数组,也可能有一个 LongLength() 例程,其 32 位的实现与 Length() 相同。 Length() 会抛出 如果应用于超过 2^32 的动态数组,则在 64 位中出现异常 元素。

  • 与此相关的是,可能会改进错误检查 缩小语言中的运算,特别是缩小 64 位值 到 32 位位置。这会影响分配的可用性 如果 Length(),则将 Length 的值返回到 Integer 类型的位置, 返回 Int64。另一方面,专门针对编译器魔法 像 Length() 这样的函数,所采用的魔法可能有一些优势, 例如根据上下文切换返回类型。但优势不可以 非魔法 API 中的情况也类似。

  • 动态数组可能支持 64 位索引。请注意,Java 即使在 64 位平台上,数组也仅限于 32 位索引。

  • 字符串可能会限制为 32 位索引。我们有一个艰难的 是时候为人们想要 4GB+ 字符串的人提出现实的理由了 这确实是字符串,而不仅仅是托管的数据块,为此 动态数组也可以起到同样的作用。

  • 也许是一个内置的汇编器,但有限制,比如不能与 Delphi 代码自由混合; x64 上还需要遵循有关异常和堆栈帧布局的规则。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该如何为最终的 64 位编译器准备 32 位 Delphi 程序? [复制] 的相关文章

  • 如何向标准集合编辑器添加图标?

    我有一个自定义控件 它利用TCollection and TCollectionItem 在集合编辑器中 我想向每个列表项添加图标 该列表项由内部TImageList 在其父组件内 集合项本身代表图标 我想在这个编辑器中显示相应的图标 如何
  • 当 Delphi 处于覆盖模式时,如何更改它的光标形状?

    当使用 Delphi 的任何版本时 我有时会碰巧按下插入键并打开覆盖模式 这通常是一个很大的麻烦 并且您进入覆盖模式的唯一指示是编辑器底部的小文本 当使用其他程序 首先想到的是 Notepad 时 当您处于插入模式时 文本光标是 当您处于覆
  • git diff 在尖括号中显示 unicode 符号

    我有一个带有 unicode 符号 俄语文本 的文件 当我修复一些拼写错误时 我使用git diff color words 看看我所做的改变 如果是 unicode 西里尔文 符号 尖括号会造成一些混乱 如下所示 cat p1 cat p
  • 调试器异常错误和内存超调

    我尝试运行以下代码 但它显示有关内存地址的错误 并显示一条消息 循环后 n 可能未定义 请看一看 var n max integer n integer r R1 f h0 Array of Real const h 0 00889 nip
  • TColorProperty德尔福柏林10.1.2?

    我正在尝试将组件从 Delphi 7 转换为 Delphi Berlin 平面组件 https sourceforge net projects flatstyle https sourceforge net projects flatst
  • 如何释放 TInterfacedObject 中的 TObject 成员

    我知道接口对象是引用计数的 因此不需要手动释放它 但如果它有一个 TObject 继承成员 我是否应该在析构函数中手动释放该成员 考虑以下代码 program Project2 APPTYPE CONSOLE R res uses Syst
  • Delphi应用程序窗口z顺序和MainFormOnTaskBar属性

    我正在维护一个最初用 Delphi 7 编写并移植到 Delphi XE 的应用程序 使用 Windows 7 我们遇到了一些问题 例如模态窗口出现在主窗口下方 以及最终无法与程序交互 因为用户需要与模态窗体交互 而这是不可能的 因为它位于
  • 如何去除 XSL 中字符的重音符号?

    我一直在寻找 但找不到相当于字符 规范化空间 的 XSL 函数 也就是说 我的内容带有重音 UNICODE 字符 这很好 但是从该内容中 我正在创建一个文件名 但我不想要这些重音 那么 是否有一些我忽略的东西 或者没有正确地谷歌搜索来轻松处
  • 通过套接字发送动态数组(在记录内)?

    我正在尝试直接使用 SendBuf 将记录从服务器传输到客户端 但是 该记录有一个动态数组的成员 并且我在某处 在 SOF 中 读到 发送记录时 成员必须是静态的 固定长度 但问题是 我无法确定如何我会 将来 发送许多论点 我怎么解决这个问
  • 如何将 Unicode 字符转换为简单形式? [复制]

    这个问题在这里已经有答案了 有没有一个Go库可以Sj str m作为输入和返回Sjostrom作为输出 您可以使用golang org x text unicode norm来处理这个问题 package main import fmt i
  • 如何比较枚举类型集

    从某个时刻开始 我厌倦了编写设定条件 and or 因为对于更多的条件或更长的变量名 重新编写会变得笨拙且烦人 所以我开始写助手这样我就可以写ASet ContainsOne ceValue1 ceValue2 代替 ceValue1 in
  • Delphi - 如果没有创建类,为什么这个函数可以工作?

    考虑这个类 unit Unit2 interface type TTeste class private texto string public function soma a b integer string end implementa
  • 阻止 IDE 自动添加使用单位

    我正在将 Lazarus 项目转移到德尔福西雅图 Lazarus 项目依赖于 40 多个单元 包括控件 并具有多种应用程序 在所有项目的使用条款中 他们使用了以下内容 uses Classes SysUtils Forms Controls
  • 与区域指示符字符类匹配的 python 正则表达式

    我在 Mac 上使用 python 2 7 10 表情符号中的标志由一对表示区域指示符号 https en wikipedia org wiki Regional Indicator Symbol 我想编写一个 python 正则表达式来在
  • 如何在 SVG 中显示 unicode?

    以 SVG 格式存储在数据库中的信息 如果数据包含文本 它将显示为 Unicode 有必要在浏览器中正确显示 SVG 文件
  • 在 PowerShell 中显示 Unicode 表情符号

    我想在 PowerShell 中显示像 U 1F4A9 这样的 Unicode 表情符号 我知道这仅在 ISE 控制台内有效 但我不知道如何操作 到目前为止我尝试过的 CharBytes System Text Encoding Unico
  • Delphi 中表单分发与其生命周期相关的接口对象的安全方法?

    我有一个 Delphi 表单 它提供接口对象背后的功能 代码的其他部分也通过属于该表单的属性获取引用 我无法将接口功能委托给子对象 因为太多的功能是由表单上的控件 组件提供的 我无法使用 TAggregateObject 或 TContai
  • Delphi - Indy - 保存 GMail 草稿

    我一直在 Delphi 下使用 Indy 通过 gmail 帐户发送消息 使用 TIdSMTP 和 TIdMessage 组件 这绝对没问题 但是 我的客户请求将消息保存到 DRAFTS 文件夹 以便他在实际发送消息之前对 以编程方式创建的
  • Delphi 的内存分析工具?

    我建立了一个项目并运行它 然后在 Process Explorer 中查看它 结果发现它在启动时使用的 RAM 比我想象的要多 5 倍 现在 如果我的程序运行得太慢 我会将其连接到分析器并让它告诉我什么正在使用我的所有周期 有没有类似的工具
  • 为什么在 Python 2.4 中使用 Unicode 数据会出现 ASCII 编码错误,而在 2.7 中却不会?

    我有一个程序 当在 Python 2 7 中运行时 会生成正确的 Unicode 输出到标准输出 当在 Python 2 4 中运行时 我得到UnicodeEncodeError ascii codec can t encode chara

随机推荐