Delphi 6句代码实现Delphi动态调用API函数


本文整理自网络,侵删。

 
procedure TForm1.formcreate(Sender: TObject);  //这里相当于于易语言的启动窗口事件,就是当窗口被创建时,就会运行下面的代码
 
type    //首先用type定义一个函数,参数跟MessageBoxA一样,用stdcall调用约定
   MyMessageBox = function(hWnd:Cardinal;lpText, lpCaption: AnsiString ;uType: Cardinal): Integer; stdcall;   //定义的函数名为MyMessageBox,这里跟静态调用不同的是,静态调用是 function 函数名(参数),这里是  函数名=函数(参数)
var
    MyMessage:MyMessageBox;     //定义一个变量名为MyMessage,令这个变量的类型是MyMessageBox,也就是这个变量等于函数
    apiaddr:Integer;    //保存获取到的api函数地址
    tiaoshi:Integer;    //用来做调试输出用
begin
     apiaddr:=Integer(GetProcAddress(LoadLibrary('user32.dll'), 'MessageBoxA'))+2;   //这里+2是为了测试朱朱说的7字节热补丁,实际上api函数的mov edi,edi是没有意义的,这句代码占2个字节,故我们可以直接用push开始执行,所以这里+2,也可以不+2,因为getprocessaddress返回的是pointer类型,所以用integer转整数再+2
     @MyMessage:=Pointer(apiaddr);   //这里就将这个+2以后的地址转成pointer类型,加@是为了取MyMessage的实际地址,但是这里好像不加@也可以,但是为了保险还是加@
     tiaoshi:=Integer(@MyMessage);   //这里拿来做调试输出,可不用这句代码
     MyMessage(0,'动态调用','动态调用',0);  //这里我们声明的一个局部变量,他的类型是函数类型,所以这里这个局部变量就等于我们的函数了,所以直接调用,注意Delphi下,MessageBoxA的标题和内容参数是ansistring类型,如果我们定义的函数是string类型,那么就应该调用MessageBoxW,否则会乱码
 
end;

来源:https://www.52pojie.cn/forum.php?mod=viewthread&tid=987258&extra=page%3D1%26filter%3Dtypeid%26typeid%3D27

相关阅读 >>

Delphi sql语句查询最新的各个台位的最后一个检测值

Delphi sqlite实现加密

Delphi原生方法取得文件的md5

Delphi锁定鼠标 模拟左右键 静止一会自动隐藏鼠标

Delphi pascal 单元文件的特殊定义格式

Delphi 中压缩流和解压流的应用

Delphi 中有 iif() 函数

Delphi ^ 符号的特殊用法

Delphi xe5中以andorid 启动应用程序

Delphi 调试tms web core应用

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...