• 标 题:为delphi程序添加功能按钮
  • 作 者:小楼
  • 时 间:004-06-15,21:15
  • 链 接:http://bbs.pediy.com

为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
  end


2.添加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