文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 精品软件 | 下载排行 | 推荐下载 | firefox | WPS | 杀毒软件 | Picasa
清风网络
首 页 软件下载 网络学院 数码学院
QQ 电脑入门 游戏 操作系统 图形图像 办公软件 媒体动画 精文荟萃 常用软件 网页编程 技术开发 网络技术 认证考试 网站建设 文章专栏
当前位置:清风网络学院程序开发DelphiDelphi的嵌入式汇编语言与Windows函数调用
精品推荐
特别推荐
·利用Delphi编写Socket通信程序
·拦截其它程序的网络数据封包
·Delphi编程根据IP地址得到主机名
·Delphi 程序员代码编写标准指南
·用DELPHI开发自动化服务器
·将日期转化为汉语的形式
·加密ACCESS数据库增加安全性
·使用TCP/IP协议实现聊天程序
·在Delphi中控制扫描仪
热点TOP10
·Delphi下“培养”自己的简单木马
·Delphi中DLL的创建和使用(1)
·DELPHI基础开发技巧
·利用Delphi编写Socket通信程序
·Delphi 程序员代码编写标准指南
·使用TCP/IP协议实现聊天程序
·在Delphi中实现数据分析模块的动态报表
·先人的DELPHI基础开发技巧
·Delphi中远程控制的实现
·将日期转化为汉语的形式
·Delphi 6 SOAP 源码中的BUG修正
·Delphi建立键盘鼠标动作纪录与回放
·实现webbrowser中的打印、复制、全选等编辑功能
·用Delphi实现WinSocket高级应用
·基于Delphi的“八皇后”问题动态实现
·教你在DELPHI中基础开发技巧
·用DELPHI开发自动化服务器
·Delphi中动态链接库(DLL)的建立和使用
·DBGrid使用全书(三)
·Delphi版模仿熊猫烧香病毒核心源码

Delphi的嵌入式汇编语言与Windows函数调用

日期:2007年5月2日 作者: 查看:[大字体 中字体 小字体]



  Delphi是一种基于Pascal的面向对象的可视化程序设计工具,功能强大,编译速度极快,
  性能非常卓越。但是在Delphi中,却不像C语言一样能方便地利用函数指针,对已知地址
  的函数进行调用。
  
    如在Windows环境中用C语言编程,经常碰到如下形式的函数调用:
  
   ...
  
   FARPROC lpGetversion;
  
   ...
  
   lpGetversion=GetProcAddress(hinst,"getVersion");
  
   (*lpGetversion)();
  
   ...
  
    而在Delphi中,对用GetProcAddress获得的32位函数地址,如果采用类似C语言的
  形式调用函数指针,便会在编译时碰到错误,根本无法通过。如:
  
   例1 直接地址调用,错误是91号;
  
   lpGetversion; { error 91 ″:=″ eXPected}
  
   例2 带空参数直接地址调用,错误是91号;
  
   lpGetversion(); { error 91 ″:=″ expected}
  
   例3 间接地址调用,错误是43号;
  
   lpGetversion^; { error 43 iiiegal assignment}例4 带空参数间接地址调用,错误是43号;
  
   (lpGetversion^)(); { error 43 iiiegal assignment}
  
    在Windows系统的编程实践中,如钩子(HOOK)函数的编写和某些未公开的函数的
  调用等,必须用函数指针来调用函数,那么该怎么调用呢?
  
    答案是必须采用嵌入式汇编语言来调用函数指针,因为在Delphi的Help中,明确指
  出:The only use for procedural pointer is to pass it to an assembly language routine or to use it in  
  a inline statement。所以,如果我们获得了DLL中的函数地址,想利用它来调用该函数,只
  需在程序中插入一小段很简单的汇编程序,就能调用了。举例如下:
  
    ...
  
    var {声明函数指针lpGetVersion}
  
    lpGetVersion :TFARPROC;
  
    ...
  
    lpGetVersion:=getProcAddress(GetModuleHandle(′kernel′),′getversion');
  
    if lpGetVersion=nil then exit; {获得模块kernel 中的函数getVersion的指针lpGetVersion}
  
    ....
  
    asm {用汇编形式调用函数getVersion}
  
    call lpGetVersion {不用;  用; 也可以}
  
    end;  
  
    ... 
  
     现举一个简单的例子,在按钮上单击一下,利用汇编语言调用getversion函数得到
  Windows和DOS 的版本号:
  
    unit Getveru;
  
    interface
  
    uses
  
    SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  
    Forms, Dialogs, StdCtrls;
  
    type
  
    TForm1 = class(TForm)
  
     Button1: TButton;
  
     Label1: TLabel;
  
     Label2: TLabel;
  
     Label3: TLabel;
  
     procedure Button1Click(Sender: TObject);
  
    private
  
     { Private declarations }
  
    public
  
     { Public declarations }
  
    end;
  
    var
  
    Form1: TForm1;
  
    implementation
  
    {R *.DFM}
  
    procedure TForm1.Button1Click(Sender: TObject);
  
    var
  
    lpGetVersion:TFARPROC;
  
    version:longint;
  
    versionLowWord:word;
  
    versionHighWord:word;
  
    begin
  
    lpGetVersion:=getprocAddress(GetModuleHandle  
  
    (′kernel′), ′getversion′);  
  
    {GETVERSION 函数在模块 KERNEL中}
  
    {lpGetVersion 存放GETVERSION 的地址}
  
    if lpgetVersion=nil then exit;
  
    label1.caption:=intTostr(selectorof(lpgetversion))
  
    +':' +intTostr(offsetof(lpgetversion));{取32位地址的高16位用selectorof}
  
    {取32位地址的低16位用offsetof }
  
    asm {嵌入式汇编语言标记}
  
    call lpgetversion
  
    mov versionLowWord,ax
  
    {ax寄存器放Windows版本号}
  
    mov versionHighWord,dx  
  
    {dx寄存器放DOS版本号}
  
    end;
  
  
  
    label2.caption:=′Windows Version ′+
  
    intTostr(lobyte(versionLowWord))
  
    +′.′+intTostr(hibyte(versionLowWord)); {取16位 2进制数 的低8位用lowbyte}  
  
    {取16位 2进制数 的高8位用hibyte}  
  
    label3.caption:=′MS-DOS Version ′+
  
     intTostr(hibyte(versionHighWord))
  
     +′.′+intTostr(lobyte(versionHighWord));
  
    end;
  
    end 


[1] [2] 下一页 




上一篇:Delphi的类型转换

下一篇:DELPHI的通配符比较

Delphi的嵌入式汇编语言与Windows函数调用 相关文章:
·Delphi的嵌入式汇编语言与Windows函数调用
Delphi的嵌入式汇编语言与Windows函数调用 相关软件:

特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
[打印本页] [关闭窗口] 转载请注明来源:http://www.viphot.com
| 帮助(?) | 版权声明 | 友情连接 | 关于我们 | 信息发布
Copyright 2007 www.viphot.com All Rights Reserved. 鄂ICP备05000083号Powered by:vipcn