📄 readme.txt
字号:
CpuWHelper 1.6
=========================
作者 : Aimingoo
时间 : 2004.06.25
授权 : Freeware
1. 编写这个软件的原因
=========================
调程序时,要用到Delphi的CPU窗口的人并不是非常多。但是,一旦使用它,你会发现一个极致命的问题:在
CPU窗口中的汇编代码无法复制出来!
我的一些朋友因为这个问题,而放弃了CPU窗口,转而使用SoftICE等第三方的汇编级调试器。但是,还是有人
告诉我:“其实CPU窗口中的功能比SoftICE一点不弱,就是缺了复制代码的功能。”
最近写书,大量的地方要摘引CPU窗口中的代码,一行一行地抄写弄得我无以忍受。终于决定放下所有的工作,
来编写这样的一个程序。
2. 功能
=========================
这个工具仅用于解决如上的问题。如果你根本不使用CPU窗口,那你也根本不需要安装这个程序。
CpuWHelper是一个Delphi扩展专家工具,它会自动地集成到Delphi IDE中,除了IDE的少许变化,你不会感觉
到它的存在。同时,它不会导致任何的Bug。如果Delphi出错,相信我,不是它干的。^o^
CpuWHelper只有在你打开CPU窗口之后才会正式开始工作,此前它是静默的。它会在CPU窗的汇编代码区的右键
菜单上添加两个项:
Copy Special Lines : 缺省情况下,复制自可见区顶部开始的 30 行代码到剪贴板
Copy Line... : 定制复制参数,并按设置复制代码到剪贴板
你应该知道的是:只有在调试状态下(例如有一个程序断点被触发),才能打开CPU窗口。
3. 特点
=========================
1). 安静运行,对Delphi IDE无任何影响。
2). 定制任何行数,不受限于CPU窗口的可见区大小。
3). 可定制设定界面语言(当然,为了和IDE一致,在CPU右键菜单上加入的子菜单项总是英文的)。
4). 可将内容另存到文件。
5). 源代码规范,易于扩展。
6). 支持D4-D7(对D4的支持略有问题,但我相信已经没人用那个东东了)。
4. 安装
=========================
1). 解压CpuWHeler.dll到任意目录
2). 打开注册表,找到如下键
HKEY_CURRENT_USER\Software\Borland\Delphi\7.0\Experts
(* 对应于不同的Delphi版本,上面的版本号会有相应的变化,请自行调整)
3). 创建一个字符串值,名字任意,建议使用"CpuW Helper";值为CpuWHelper.dll所在的全路径。例如:
name : CpuW Helper
value : E:\Program\CpuWHelper\CpuWHelper.dll
6. 其它
=========================
要在汇编代码区“选中一块文本并复制”是不可能的,因为这个代码区是基于TCustomControl实现的,而不是
Memo,所以基本上没办法对它做更多的操作。
在目前的测试用,for D4的版本存在一个BUG:退出Delphi时会有一个异常。应该是Delphi IDE的问题。我想如
果没有for D4的用户,那么,这个BUG我就不再修正了。——如果你还在用Delphi 4,请告诉我。哪怕只存在一
个用户,我也会试图去修改它。:)
对于D4-D6版本的Delphi,存在一个别的选择,你可以使用vladimir开发的vtExpert 1.11。这个东东实现了比
CpuWHelper更多的功能。但是,一年前它就停止开发了。我不知道它是否使用和CpuWHelper一样的思路,因为
vtExpert是不公开源代码的。
vtExpert: http://www.donpac.ru/~vladimir/exp.zip
7. 关于开发计划
=========================
限于时间,我已经决定停止开发。仅将原来的一些想法公开,如果你有继续开发的想法并在实施中遇到问题,
可以随时跟我联系(哦,本软件的源码是完全公开的)。这些计划的功能包括:
1). 组合IDE中的调试功能,例如Debug Windows\Modles窗口,使这些窗口能被集成到CPU窗。集成的方案(包
括界面布局)可以参考软件OllyDBG.
2). 可以复制包括FPU/寄存器/内存转储等全面的CPU窗体信息。
3). 加入一个命令行,可以浮在CPU窗上(象输入法那样)或附着在窗体下面。命令功能是SoftICE的一个子集。
4). 所有命令可以用文本对照表的形式自行编辑。方便习惯使用其它调试器的用户。
依据我目前对CPU窗体、Delphi IDE和OTA的了解来看,实现上面的功能是可以做到的,至少没有太明显的技术
门槛。
8. 技术文档补遗
=========================
2003.06.01 v1.5
1. CPU窗体基于TCustomControl
--------------
在以前版本的readme.txt和技术文档中,都说CPU窗体基于Panel实现,那实际上是我最初分析时的一个理解
错误。在开发到v1.3的时,我已经很明确地知道它是基于TCustomControl实现的了。但文档中相关的地方一
直未能修改。特此更正。
2. 多语言界面的实现
--------------
我直接使用了JanSoft发布的TjanLanguage 1.0。但你应该知道,这个1999年发布的组件存在不少的问题。如果
你对我如何修正这些问题有兴趣,可以去torry.net下载一份原始版本,对照着看一看。
还应该知道的是:TjanLanguage只能支持到单层界面:对容器组件和窗体嵌套,它就无能为力了。虽然我已经
想到基于该组件的原思路解决这个问题的方法,但已经不打算继续做了。——需求决定一切,我还要继续写书。:(
3. 关于挂Action.OnExecute的进一步讨论
--------------
自1.3开始,我使用了带运行期包的方式发布CpuWHelper。正如yygw所述,这同时带来了一个便利:可以访问TScreen
了。因此,在1.5中,我接受yygw的建议,使用挂Screen.OnActiveFormChange的方法来在CPU窗中安装菜单。
也因此解决了“IDE自动弹出CPU窗时,CpuWHelper 无法钩挂”的BUG。
但是,我仍在代码中保留了原来的钩挂代码。这是因为如果使不带运行期包的方法,则挂这个方法是无效的。
你可以将旧代码中采用的方法看成一种技术探索,也是在DLL中访问HOST中的对象的一种有效方法。
4. 有关版本兼容
--------------
可能你对版本兼容有一些存疑:比如是否这样做。但我毕竟这样做了,所以我也随手改了一下来自CnPack的代码
CnWizMenuHook.pas。
在所有的为兼容而做的修改中,有一行是需要说明的:
-------------
procedure TCnMenuHook.OnMenuPopup(Sender: TObject);
//...
begin
//Menu := Sender as TPopupMenu;
Menu := TPopupMenu(Sender);
// or : TObject(Menu) := Sender;
//...
end;
-------------
这一处的修改并不是为Delphi版本兼容而做的。而是为了在不使用运行期包的CpuWHelper中使用TCnMenuHook的
功能而做的修正。在没有运行期包的情况下,Sender中传入的对象是由IDE传入的,执行 as 操作的却是DLL。而
DLL与IDE使用着两套不用的RTL/VCL。这样,as(或者is)操作将会失效。——在一些书籍中,将这类问题直接归
结为“DLL中不能导出对象”的问题。
但是,由于使用是的用一个Delphi版本进行的编译,所以IDE中的RTL/VCL与我们在DLL中使用的是兼容的。因此,
我们可以不做检测地进行强制转换。
有关这种强制转换或as/is的原理和内部机制,会是一大篇的文章,我会在我正在写的书里更深入的讲述这些。
这里只是提出来。——哈哈,不是卖关子,而是相关内容实在太多了。:)
2003.06.01 v1.3
1. 添加子菜单项的问题
--------------
在这个版本里, CpuWHelper首次使用了第三方的代码. 这是来自于CnPack的CnWizMenuHook.pas单元. 这个
单元很好地解决了在D4-D6版本的右键菜单中加入较多的子菜单项时出现的问题.
问题的成因如下:
对于IDE中的任意右键菜单, 使用TMenu.add()方法加入子菜单项是安全的. 但是, 如果原处理程序中的OnPopup
事件对菜单进行了操作, 例如使用菜单索引的方式访问了菜单项, 那么, 由于新的子菜单的加入将会导致原有的
代码出错.
CnWizMenuHook.pas采用的技术原理是这样的:
1. 钩挂OnPopup事件
2. 删除由CnWizMenuHook加入的子菜单项
3. 调用原OnPopup事件
4. 列举并重新插入所有的子菜单项
由于在执行第3步时, 菜单与主应用程序的原始状态是一致的, 所以主应用程序(Delphi IDE)能够完全正常的
执行, 从而排除了D4-D6中在PopupMenu中添加子菜单项的BUG.
2. 挂Action.OnExecute的问题
--------------
在v1.2及以下版本中, 采用了嵌入汇编的方法来取InstallExpert的内存地址, 并使用HelperTools.pas单元中
的InitObjMethod()函数来构造TMethod. 该方法的技术细节在<<CpuWHelper 的开发技术概要>>和<<如何跨单元、
跨类地访问Delphi 类的私有域方法>>两篇文章中有详细说明.
在v1.3版本, 采用了定义方法变量, 支接使用Delphi标准的存取方法来操作InstallExpert(), 使得相应的代码
更加简化和易于理解.
9. 版本历史
=========================
2004.06.25 v1.6 修正了复制代码时,当前可见区之外的源代码(SourceText)不能被复制的BUG。
对源代码中的HelperTools.pas单元使用了全英文注释,便于发布英文版。
2003.06.27 v1.5 调整了一下配置窗体界面的字体,正式发布。
2003.06.03 v1.5 实现多语言界面。
实现配置系统的存储和载入。
修正了IDE自动弹出CPU窗时,CpuWHelper 无法钩挂的BUG。
2003.06.01 v1.3 解决了在D4-D6中的只能加入两个菜单项的问题。感谢yygw的支持,感谢CnPack项目。
根据yygw的建议, 采用带运行期包的方式发布.
2003.05.28 v1.2 完成for Delphi4/5/6的版本。全面实现了版本兼容(使用同一套代码)。
2003.05.22 v1.1 使用标准DLL Wizard方式替换了ExpertWizard,使程序更加稳定。
2003.05.15 v1.0 完成所有的功能代码,并展开小范围的试用。
10. about me
=========================
mail : aim@263.net, aiming@ynxx.com
web : http://www.doany.net/, http://aiming.ynxx.com/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -