【问题标题】:How to patch a method in Classes.pas如何修补 Classes.pas 中的方法
【发布时间】:2010-12-01 17:23:14
【问题描述】:

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

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

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

【问题讨论】:

  • 您确定没有基于配置的方法来满足您的需求吗?修补 classes.pas 真的应该是你最后的手段......
  • 是的,有一种基于配置的方法 - 更改整个系统的区域设置!问题是 D2009 看起来并不完全是 Unicode(我认为 DFM 仍然包含 AnsiStrings)。我希望能够在一台机器上加载不同的资源 dll(英文/日文/中文/韩文), 不更改系统区域设置
  • 据我所知,DFM 被处理为 UTF8。
  • 成功修补 TReader.ReadString 后,我发现 DFM 中有一些 AnsiStrings,但不是那些导致我问题的...
  • 巴里,感谢您的回答/cmets。仍然没有弄清楚我们的本地化内容到底出了什么问题,但不知何故,代码页 932 (SHIFT-JIS) 文本被写入了 .dfn 文件而不是 UTF8。整个修补工作已经变成了一种不必要的转移……

标签: delphi delphi-2009


【解决方案1】:

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

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

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

这样做的结果是您应该能够将 Classes.pas 添加到您的项目中,并几乎可以根据自己的意愿修改其 实现 部分,并且仍然能够静态地 strong> 与其他 RTL 和 VCL 以及第三方库的链接,即使是那些仅以对象格式提供的库。

注意事项:

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

【讨论】:

  • 另外,他应该更改 Classes.pas 的副本并添加到项目中,避免更新问题。
  • 好的,我复制了 Classes.pas 并将其添加到我的项目中。由于如上所述的符号版本问题,无法构建。尝试根据问题“D2009 VCL unit that won't compile' without joy.设置所有编译器选项。因为无论如何我都需要修改公共接口,所以没有进一步追求。
【解决方案2】:

我找到了 VCLFixPack:

https://www.idefixpack.de/blog/bugfix-units/vclfixpack-10/

我使用其中的技术替换了我想在运行时修补的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多