0

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

4

3 回答 3

2

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

你可以在这里找到它:http ://code.google.com/p/asmprofiler/source/browse/trunk/SRC/KOLDetours.pas

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

于 2013-11-15T00:52:30.990 回答
1

In a comment you state:

I have 22 packages. Each package has (besides others) a unit with all the units in that package placed in interface section, and a procedure with simple RegisterClass(TSomeClass) for every class in that package.

In which case the answer is obvious. Define your own function, named MyRegisterClass for instance, and call that function instead.

于 2013-11-15T11:00:45.563 回答
1

要回答您的具体问题:

您可以Classes.RegisterClass简单地使用@Classes.RegisterClassClasses.pas 的 interface 部分中公开的地址来获取地址。

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

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

正如您所指出的那样,您正在静态链接到包,这一切都没有实际意义,因为您将没有机会连接您设计的任何通知例程。为了解决这个问题,您需要在创建启动画面并准备好为其发送消息后动态加载您的包。

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

于 2013-11-15T06:15:53.673 回答