您的位置:首页 > 编程语言 > Delphi

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

2007-12-01 22:07 393 查看
近端都是用汇编,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:=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函数的功能,这样大家就会更容易理解些。  
     
    好了,相信大家看到这里都应该可以很清楚的明白静态动态调用api函数的方法了吧,教程比较容易就当是练手吧,我建议大家用动态调用api函数,因为静态调用api会在EXE文件被加载时调用的DLL文件也相应会加载到内存,我们用动态调用api则可以控制,废话不多说了,希望这篇基础教程可以帮助倒别人。

429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 
990 991 992 993 994 995 996 997 998 999 0 1 2 3 4 5 6 7 8 9 10850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息