【发布时间】:2016-12-07 15:45:13
【问题描述】:
这个问题和我之前的问题有关:
access violation at address in module ntdll.dll - RtlEnterCriticalSection with TCanvas.Lock
显然 Delphi 的代码中有一个错误(请参阅QC 64898: Access violation in FreeDeviceContexts)。这个错误一直持续到 D2010,AFAIK。
到目前为止,建议的解决方法运行良好。现在我进退两难了。
我不喜欢在我的项目中使用 Controls.pas 的私人副本的想法 - 我不确定它是否安全。 Controls 单元是一个非常低级的单元,考虑到我的巨大应用程序运行良好,我真的觉得这是一个激烈的举动,除了提到的问题。我也不确定是否/如何重建项目中依赖Controls 单元的所有组件/单元。
是否可以修补使用内部CanvasList 和私有成员的TControlCanvas.CreateHandle()?
注意:我将只为这个项目使用补丁(Delphi 5)。我不介意硬编码偏移量。 AFAIK,补丁私有总是使用硬编码的偏移量,基于编译器版本。我可能能够自己处理私人事务(没有类助手),但我不知道如何处理 CanvasList 和 FreeDeviceContext(),它们在 Controls 的实现部分中声明单位。
【问题讨论】:
-
在 D5 中并不容易。您将如何访问私人信息?还是
CanvasList?没有帮手破解隐私。并且没有简单的方法可以访问CanvasList。可以通过一些棘手的逆向工程来完成。但毫无意义。使用你自己的Controls单位就可以了。这没有问题。什么不安全? -
虽然 D5 中没有“类助手”,但您仍然可以使用覆盖类(相对)轻松地访问您拥有源 (deltics.co.nz/blog/posts/825) 的任何类的私有成员。在这种情况下,这是否有帮助或者是正确的做法是另一回事。一个固定的(定制的)Controls 单元可能是要走的路。
-
它不需要重建整个 RTL。因为您只更改了单元的实现,所以不需要重新构建 RTL。
Controls的接口部分没有改变,链接器只是链接到你的单元而不是 Borland 单元。 -
@DavidHeffernan,我可能会选择按照你的方式去做。我不坚持。我的问题是:
Is it possible to patch TControlCanvas.CreateHandle?我只是好奇它是否可行。就是这样。 -
如果你改变接口然后编译器对象。它告诉您使用
Controls的单元是针对不同版本的单元编译的。试试看。向TControl添加一个什么都不做的方法。
标签: delphi patch delphi-5 detours