拦截Classes.pas Delphi7中的RegisterClass方法

时间:2013-11-14 21:10:02

标签: delphi delphi-7

有没有办法做到这一点?已注册类的列表位于Classes.pas单元中的TRegGroups实例中,但问题是该实例是在unit的实现部分中声明的。有没有办法获得RegisterClass过程的地址,或RegGroups.RegisterClass方法?

3 个答案:

答案 0 :(得分:2)

使用KOLDetours.pas,您可以拦截对该方法的调用,然后调用原始方法。

您可以在此处找到它:http://code.google.com/p/asmprofiler/source/browse/trunk/SRC/KOLDetours.pas

该文件包含如何使用它的示例。

答案 1 :(得分:1)

回答您的具体问题:

您可以使用Classes.RegisterClass获取@Classes.RegisterClass的地址,因为它在Classes.pas的界面部分中公开。

地址TRegGroup.RegisterClass有点棘手,因为它没有在接口部分公开。使用Classes.RegisterClass的地址,您可以从编译的代码中读取TRegGroup.RegisterClass的偏移量,然后根据Classes.RegisterClass的地址计算绝对地址。最终,这将在不同版本的编译器中变得脆弱。

作为替代方案,如果您愿意对每个包进行少量修改,您可以创建一个包含名为RegisterClass的函数的单元,并确保在Classes.pas之前将该单元包含在您的注册单元中}。然后,您的单元会链接到新的RegisterClass函数,该函数可以在调用Classes.RegisterClass之前调用某种通知方法。

正如您所指出的那样,您静态链接到软件包,这一点都没有用,因为您没有机会连接您设计的任何通知例程。要解决该问题,您需要在创建启动画面后动态加载包,并准备为其提取消息。

或者,您可以修改包注册单元以使用InitProc来延迟注册,直到创建TApplication实例。这将使您有机会在注册实际发生之前创建一些表明注册进度的可视化方法。

答案 2 :(得分:1)

在评论中,您声明:

  

我有22个包裹。每个包都有(除了其他包)一个单元,该包中的所有单元都放在接口部分中,并且一个包含简单RegisterClass(TSomeClass)的过程用于该包中的每个类。

在这种情况下答案是显而易见的。定义你自己的函数,例如名为MyRegisterClass,然后调用该函数。