gpt4 book ai didi

delphi - 如何修补 Classes.pas 中的方法

转载 作者:行者123 更新时间:2023-12-03 14:44:53 28 4
gpt4 key购买 nike

我需要修补 Classes.pas 中的方法

(TReader.ReadString - 我想强制它使用指定的代码页,而不是系统默认值)。

如果我将 Classes.pas 复制到我的项目中,我最终将不得不重建整个 VCL。有没有任何(简单)方法可以在运行时修补方法?

最佳答案

修改 Classes.pas 的实现部分不需要重新编译所有内容。 Delphi 计算出一个单元是否需要通过大致如下所示的算法重新编译:

  • 如果 DCU 发现:
    • DCU 格式是否已过时(旧版本的编译器)?如果是这样,需要源码重新编译,否则编译时出错。
    • 源在路径上吗?如果是,如果它比 DCU 新,请重新编译
    • 对于每个使用的单位:
      • 加载时重复分析
      • 对于该单元中每个使用的符号(“导入”:类型、变量、例程、初始化常量等):
        • 导入的符号版本是否与使用单元中找到的符号不同?如果是这样,需要重新编译。
  • 如果没有找到DCU,则需要找到源代码并编译,否则编译时错误

重要的概念是符号版本。保存 DCU 时,Delphi 会根据符号的接口(interface)声明计算哈希值,并将其与符号关联起来。使用该符号的其他单元也存储该符号版本。通过这种方式,可以避免由过时符号引起的链接时冲突,这与大多数 C 链接器不同。

这样做的结果是,您应该能够将 Classes.pas 添加到您的项目中,并根据您的喜好修改其实现部分,并且仍然能够静态 与 RTL 和 VCL 的其余部分以及第三方库链接,甚至那些仅以对象格式提供的库。

注意事项:

  • 内联例程;内联例程的主体是符号版本的一部分
  • 泛型;泛型类型和方法的实现端是各自符号版本的一部分

关于delphi - 如何修补 Classes.pas 中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1482311/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com