在Delphi和VC中创建和调用DLL
http://tech.cn.tom.com2001年10月31日来源:天极网丛蓉 李恺
大家在软件开发时经常会遇到这样的情况,在不同的开发环境中为实现一些功能相同的过程,由于开发所使用的设计语言不同,因而不得不编写许多类似的代码,甚至有时要在同一个开发环境不同项目中重写代码,这就造成了很大的资源浪费。动态链接库能较好的解决这个问题,重复利用代码将大大提高了开发效率。一般,用户在应用程序中基于如下要求创建和使用DLL:1. 在不同的可执行文件之间共享的程序;2. 在设计应用程序时,将其拆分成各个相互独立功能部件,为以后这些功能部件各自升级提供方便的途径。动态链接库将共享程序或功能部件做成库中的函数,形成DLL文件,其它应用程序通过使用DLL调用这些函数。在这里将对Delphi和VC中创建和使用动态链接库的方法做一介绍。Delphi和VC定义的动态链接库均可在两者的开发环境中使用。一、 用Delphi创建DLLDelphi的DLL创建并不复杂,下面向大家介绍Delphi的DLL创建方法。(1)首先创建一个新的DLL项目(NewProject)project1,文件头部为:library Project1; (2)USES语句后面加入ExPorts语句,指明调用DLL的函数名,形式为:exports
  checkpwd name 'checkpwd'; (3)在DLL的Pas文件中Type......End后加入该DLL的函数或过程的声明,形式如下:FunctionName(argment):Boolean;export; 该函数也可以存在于另一个pas文件中(如Unit1.pas),此时只需在项目文件中加入:uses
  Unit1 in 'Unit1.pas' {Form1}; 值得注意的是,该函数或过程应加入窗体的Create和Free(产生和释放)方法。(4)对项目进行编译即形成DLL文件,可被其它项目调用。二、Delphi中DLL的调用调用DLL有两种方法,一种是在应用程序装载时调用,另一种是在应用程序运行时调用。(1) 装载时调用DLL在调用DLL的Pas文件中,对DLL函数进行外部声明,声明应位于Implementation后,形式如下:Implementation
  Function functionname(argment):Boolean;far;External 'DllName'; 其中External关键字后面的引号内是DLL的文件名,该文件一般应放在系统的system目录下,或与调用它的项目同一目录。声明以后即可在Pas文件任何地方引用DLL函数。装载时调用DLL的优点是速度较快,程序间也可共享代码。(2) 运行时调用DLLDLL的另一种调用方法是在运行时调用。这种方法要调用到Windows的API函数LoadLibrary,GetProcAddress,FreeLibrary等。此方法主要用于调用其它语言,特别是C++编译的DLL。假定你欲调用的DLL中包括一个函数:Function checkpwd(pwd:string):boolean;export; 那么,首先在欲调用DLL的程序Type类型声明处加入一句:Type
  Tcheckpwd= function(pwd:string):boolean; 此句的作用如同C++中声明的函数指针。然后定义如下变量∶Var
  aptr:TFarproc;
  lhnd:THandle;
  flag:boolean; 其中Aptr,lhnd两变量声明必须有,flag是DLL函数返回值,视情况而定。在调用DLL处加入如下语句进行DLL装载:lhnd:=Loadlibrary('路径:DLL文件名');{如lhnd:=Loadlibrary('c:\project1.dll');
  aptr:=GetprocAddress(lhnd,'checkpwd'); 下面可直接调用DLL了:flag:=Tcheckpwd(aptr)( 'pwd');{根据函数填相应的变量参数} 调用完以后,用FreeLibrary释放DLL占用的内存:FreeLibrary(lhnd);