金笛工业手机论坛  

返回   金笛工业手机论坛 > 开发者乐园 > 短信开发资料

短信开发资料 短信开发技巧,代码分析

 
 
LinkBack 主题工具 显示模式
旧 2009-10-26   #1 (permalink)
高级会员
 
注册日期: 2009-07-09
住址: 亦庄经济开发区2号院大族广场1502
帖子: 526
susu8988 正向着好的方向发展
默认 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函数的功能,这样大家就会更容易理解些。
__________________
地址:北京亦庄经济开发区荣华南路2号院大族广场T2栋1502

电话:010-82356575/76/77转6070 联系人:苏秋英

手机微信同号:13811870548 QQ: 1170923055
susu8988 当前离线   回复时引用此帖
 

书签


当前查看此主题的会员: 1 (0 位会员和 1 位游客)
 

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码
Trackbacks are 启用
Pingbacks are 启用
Refbacks are 启用



所有时间均为北京时间。现在的时间是 05:42


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