首页
社区
课程
招聘
为delphi程序添加功能按钮
发表于: 2004-6-15 21:15 11770

为delphi程序添加功能按钮

2004-6-15 21:15
11770

为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



附件中原程序target.exe,修改后程序为target-p.exe

点击下载:附件!


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 10
支持
分享
最新回复 (11)
雪    币: 371
活跃值: (790)
能力值: ( LV12,RANK:570 )
在线值:
发帖
回帖
粉丝
2
果然是取巧:)
怎么我就是想不到:(
2004-6-16 08:24
0
雪    币: 212
活跃值: (70)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
我有不取巧的方法,等我整理下发上来:)
2004-6-16 11:31
0
雪    币: 220
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
大哥出手就是不凡啊,可惜不懂 delphi,嘻嘻
2004-6-16 11:42
0
雪    币: 220
活跃值: (116)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
type TPtr = packed record
TPtrLen : Word;
Ptr : Dword;
PtrName : PChar;
end;
的定义是不是有误??

我看了一一好像是这样吧?
type TPtr = packed record
TPtrLen : Word;
Ptr : Dword;
NameLen:Byte;   <--添加这项
PtrName : PChar;
end;
不知对不对.:)
2004-6-16 13:21
0
雪    币: 209
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
VB做的有没有办法实现上述功能呀
2004-6-16 13:42
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
算了吧!!干脆自己编一个程序就行了!!
2004-6-16 18:31
0
雪    币: 557
活跃值: (2303)
能力值: ( LV9,RANK:2130 )
在线值:
发帖
回帖
粉丝
8
老大请教问题:为什么把13 00 改成0F 00呢,还有就是后面的又为什么是08 00呢
(原谅我DELPHI的白痴问题)
2004-6-21 11:43
0
雪    币: 255
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
0F,08都是后面控件名长度
2004-6-26 11:56
0
雪    币: 200
活跃值: (384)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
这个文章看了很久,也搞不清楚怎么添加Button3的事件处理代码啊?

文章说到 “添加OnClick = T”就噶然而止了,没有说道怎么增加 过程 T的代码。怎么添加啊?
2006-8-2 09:23
0
雪    币: 371
活跃值: (790)
能力值: ( LV12,RANK:570 )
在线值:
发帖
回帖
粉丝
11
看看在42392h处的改动,你就会明白了:
03 00
0f 00 e8 2f 44 00 08 Button1C
0f 00 08 30 44 00 08 Button2C
08 00 08 30 44 00 01 T
2006-8-2 10:27
0
雪    币: 222
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
牛叉
2022-6-4 19:57
0
游客
登录 | 注册 方可回帖
返回
//