在Delphi或者其它程序中我们经常需要调用别人写好的DLL类库,下面直接上示例代码演示如何进行动态和静态的调用方法:
{ **********************************************************} { } { DLL动态调用与静态调用的例子 } { 编译环境 Delphi XE } { 转载或编译请不要修改此文件 } { ******************************************************* ***} { ******************************************************* ***} { Designed by Jason 2013-08-30 } { ******************************************************* ***} program LoadDll; {$APPTYPE CONSOLE} uses SysUtils,windows; type TGetcpuID = function(cpuID: PAnsiChar): integer; stdcall; //注1 function GetcpuID(cpuID: PAnsiChar): integer; stdcall;external 'cpuID_Util.dll'; var dllHandle: THandle; GetId: TGetcpuID; Id: Array [0 .. 255] of Ansichar; //注2: DELPHI XE中使用Unicode编码字符串 这里使用ansichar begin try //注3: 静态调用 WriteLn('先尝试静态调用'); GetcpuID(Id); WriteLn(Id); if (Trim(Id) <> '') then WriteLn('静态调用成功,回车尝试动态调用') else begin WriteLn('静态调用失败,回车后开始动态调用'); end; ReadLn; //注4: 动态调用 dllHandle := LoadLibrary(pchar('cpuID_Util.dll')); if (dllHandle > 32) then begin WriteLn('成功载入动态库,回车后开始调用函数'); ReadLn; GetId := GetProcAddress(dllHandle,pchar('GetcpuID')); GetId(Id); FreeLibrary(dllHandle); WriteLn(Id); ReadLn; end else begin WriteLn('动态库载入失败'); end; except on E: Exception do WriteLn(E.ClassName,': ',E.Message); end; end.
静态调用为常规方法,静态调用要点:掌握被调函数的函数名,参数数量和参数类型;
动态调用不要求程序载入时同时载入动态库,调用模式为按需调用,比较灵活,但操作技巧稍高,主要时使用了三个系统API函数(LoadLibrary,GetProcAddress,FreeLibrary) LoadLibrary载入动态库并取得句柄--->GetProcAddress取得函数入口点--->FreeLibrary释放资源
动态调用要点:1,先定义一个函数见“注1”;2,注意传入参数的类型,避免调用失败;3,注意资源使用的顺序 载入->调用->释放.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。