delphi静态和动态调用api函数详解

本文介绍了如何在Delphi中静态和动态地调用API函数。静态调用通过直接引用函数实现,而动态调用则需要先加载库并获取函数地址。示例中讲解了如何使用ShellExecuteA函数,并建议使用动态调用以控制DLL加载。
摘要由CSDN通过智能技术生成

近端都是用汇编,delphi不怎么接触了。呵呵,今天就写一个delphi静态和动态调用api函数的教程吧。也正好帮助下不会显示和隐式调用api的朋友们。基础教程,高手闪过.....
   静态调用api函数
   
  我们先来看一下这个例子。

function Shell(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST;stdcall; external 'shell32.dll' name 'ShellExecuteA';
 
   我们不难理解 shell就是我们定义的函数名,后面的括号是则是它的参数,hinst则是它的返回值类型,stdcall则是说明这个函数传递参数用的是堆栈的形式以及传递顺序,delphi默认的是通过register来传递的,因为我们api结构约定形式为stdcall。所以我们还是用stdcall来传递参数。external指示字指明我们声明的函数实际上是调用shell32库中的ShellExecuteA函数。
 
  (因为我们win32环境下,和字符串相关的api函数有两类,一类是ANSI字符集的,另一类是Unicode字符集的,前一类函数尾部都代一个A字符,后面的则带一个W字符。因为我们win32对Unicode字符集的支持的不是很好,所以我们基本上都是用的ANSI字符集的,所以我们用的则是ShellExecuteA,而不是ShellExecuteW)
  这里我总结一下静态调用api函数的一点规则
   function 函数名(参数);stdcall; external '包含我们调用api函数的动态链接库' name '函数别名';
   
  动态调用api函数
  动态调用api函数我们要先声明一个句柄,用来存取我们加载模块时返回的模块句柄,然后通过Getprocaddress函数获取我们需要的函数的地址。

我这里用一个例子吧
var
Shell:function (hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST;stdcall;
Szdll:HWND;//声明一个句柄用来存取DLL返回的模块句柄
begin
Szdll:=loadlibrary('shell32.dll');
Shell:=Getpro

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值