减小字体
增大字体
作者:佚名 来源:本站整理 发布时间:2009-03-16 20:06:25
众所周知,Windows的可执行文件可以划分为两种形式:程序和动态链接库(DLL)。而在什么时候需要使用动态链接库呢,动态链接库又有一些什么样的好处呢: |
1、一个DLL可以提供给不同的程序使用,而这个DLL只需要在内存中加载一次,这样就节省了系统的内存。 |
2、我们可以提供DLL的不同版本来更新我们的程序,而不需要重新编译我们的程序。 |
3、使用了DLL组件包可以大大减小可执行文件的规模。 |
4、如果应用程序是基于同一个组件包,我们将接生许多内存和代码分配。 |
从上面看来,DLL是独立于编程语言的;在Windows编程环境下,我们可以在不同的编程语言中调用相互编写的动态链接库,从而满足不同的需要,并且大大的提高了更新效率。 |
下面我就讲讲使用在Delphi 5.0中如何编写调用动态链接库的应用程序。 |
首先,我们要创建一个DLL,在Delphi的菜单中选择File->New,选中DLL,然后点击OK。 |
这时可以出现编写环境,请注意那里的英文说明,大概讲述了编写DLL时需要注意的地方,其中有一个非常重要的就是尽量避免使用string类型而采用pchar或者shortstring类型,否则传递的参数将出现乱码。 |
然后,将第一行的Library Project1;改成Lirbrary MyDLL;,同时保存文件,并编译,这就产生了一个DLL;当然这个DLL现在还什么都没有。现在我们给他加上一些功能。 |
SysUtils,Windows,Registry,Regstr; |
Function ChkBoolean():Boolean;stdcall; |
procedure WriteReg(UserName:pchar);stdcall; |
Reg.RootKey:=HKEY_LOCAL_MACHINE; |
If Reg.OpenKey(''SOFTWARE\MyDLL\''+UserName,True) then |
Reg.WriteString(''Name'',UserName); |
输入以上的代码,分别是一个函数和一个过程,第一个函数ChkBoolean返回一个真;过程WriteReg读取一个参数并将该参数写入注册表。在程序的最后必须加上一句: |
Exports ChkBoolean,WriteReg; |
这样表示向外声明可提供给应用程序的函数或过程,也只有在这里声明的函数或过程可以给其他应用程序所调用。 |
最后,我们编译整个程序,将产生一个MyDll.dll的文件。 |
点击File->New Application,保存这个工程,记住要和刚才那个DLL工程在同一个目录。 |
在 implementation 下编写如下代码: |
TMyProcedure=procedure(UseNam:pchar);stdcall; |
function ChkBoolean():Boolean; external MyDLL.DLL''; |
在我们程序的Form上放置一个TEdit和TButton控件,使其如下图所示: |
procedure TForm1.Button1Click(Sender: TObject); |
HInst:=LoadLibrary(''MyDLL.DLL''); |
FPointer:=GetProcAddress(Hinst,Pchar(''WriteReg'')); |
//GetProcAddress API函数用于找到DLL中的函数名,并返回一个指针 |
MyProc:=TMyProcedure(FPointer); |
ShowMessage(''DLL procedure not found!''); |
ShowMessage(''Library not found!''); |
编写完以上代码,马上运行应用程序。在输入框处输入任意字符,并点击按钮,再打开你的注册表,需要HKEY_LOCAL_MACHINE\ SOFTWARE,看看多了些什么。 |
很有意思吧,呵呵!通过这样一个简单的例子,你可以更加好的运用DLL的强大优势。同时,用DELPHI编写的DLL还可以提供给其他语言环境调用啊,比如VB,VC等等。还不赶快试试? |
Tags:
作者:佚名