为delphi程序添加功能按钮 我们知道,delphi程序是将控件的属性放入RCDATA区,但将执行控件事件的事件指针及具体代码置入.code段,两者分离。 存放控件属性的二进制代码位于程序的后段,.code段位于程序中段;所以添加控件属性不会有影响,但如果要加入控件对应事件指针,因为其位于程序中段,可能导致程序的运行错误。目前上无文章阐述此问题的解决。 target.exe是delphi5写的一个程序,上面有2个按钮,并具备执行相应事件。我将尝试再加入一个按钮Button3,并能执行Button2Click的同样功能。 1.添加按钮属性 exescope打开target.exe,在Resource的RCDATA下TForm1见到控件属性 ...... object Button2: TButton Left = 208 Top = 32 Width = 105 Height = 25 Caption = 'Button2' TabOrder = 1 OnClick = Button2Click end 我们在后面复制Button2控件属性,并做适当修改后保存为Button3。 object S: TButton Left = 40 Top = 72 Width = 105 Height = 25 Caption = 'Button3' TabOrder = 2 OnClick = T end2.添加button3事件指针 用hex workshop打开修改后的target.exe程序,搜索Button2Click,见到如下代码 以上是delphi控件事件指针表,可以由以下结构表述: Type TControlProcedurePtr = packed record PtrCount : Word; Ptr1 : TPtr; Ptr2 : TPtr; ...... PtrN : TPtr; // n = PtrCount FrmName : PChar; end; type TPtr = packed record TPtrLen : Word; Ptr : Dword; PtrName : PChar; end; 添加事件指针,最重要的就是计算清楚:如何通过缩小原有Tptr结构的长度,使得加入新指针TPtr结构后整个TControlProcedurePtr长度仍旧保持不变。 通过上述结构,我们知道TPtr结构最短长度为8字节。这里Button3.Name:='S',所以需要在前面Button1、Button2事件指针列表中挖出8个字节。我选择将 OnClick = Button1Click 改为 OnClick = Button1C OnClick = Button2Click 改为 OnClick = Button2C 添加OnClick = T附件中原程序target.exe,修改后程序为target-p.exe点击下载:附件!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!