如何在Classes.pas中修补方法

时间:2009-09-26 22:16:34

标签: delphi delphi-2009

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

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

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

2 个答案:

答案 0 :(得分:19)

修改Classes.pas的实现方面不需要重新编译所有内容。 Delphi计算出一个单元是否需要通过类似于此的算法重新编译:

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

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

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

要小心的事情:

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

答案 1 :(得分:7)

我找到了VCLFixPatch:

http://andy.jgknet.de/blog/?page_id=288

我使用了这里的技术来替换我想在运行时修补的方法。