⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readme.txt

📁 在delphi5~7的cpu窗中复制汇编代码。
💻 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 + -