金笛工业手机论坛

金笛工业手机论坛 (http://bbs.sendsms.cn/)
-   短信开发资料 (http://bbs.sendsms.cn/cy-ae-eu-ae/)
-   -   delphi静态和动态调用api函数详解 (http://bbs.sendsms.cn/cy-ae-eu-ae/722.htm)

susu8988 2009-10-26 09:38

delphi静态和动态调用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:=Getprocaddress(Szdll,'ShellExecuteA');
Shell(0,'open','http://www.mybr.org',nil,nil,0);
end;
我们首先声明一个过程类型变量,然后声明一个句柄,因为我们加载模块后会返回一个模块句柄,所以我们

把loadlibrary('shell32.dll')返回的模块句柄赋给Szdll,然后我们有了模块句柄,我们通过Getprocaddress来

获得模块中的ShellExecuteA函数的地址,然后把地址赋值给我们的Shell变量。我们可以这样理解,通过

Getprocaddress来获得模块中的ShellExecuteA函数的地址,然后把地址赋值给我们的Shell变量,我们的

shell函数就有了ShellExecuteA函数的功能,这样大家就会更容易理解些。


所有时间均为北京时间。现在的时间是 11:21

Powered by vBulletin® 版本 3.8.3
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.