读书人

Delphi DLL的创设、静态 以及动态调用

发布时间: 2012-09-01 09:33:03 作者: rapoo

Delphi DLL的创建、静态 以及动态调用
第一章 DLL简单介绍

由于在目前的学习工作中,需要用到DLL文件,就学习了下,在这里作个总结。

首先装简单介绍下DLL:

1,减小可执行文件的大小

DLL技术的产生有很大一部分原因是为了减小可执行文件的大小。当操作系统进入Windows时代后,其大小已经达到几十兆乃至几百兆。试想如果还是使用DOS时代的单执行文件体系的话一个可执行文件的大小可能将达到数十兆,这是大家都不能接受的。解决的方法就是采用动态链接技术将一个大的可执行文件分割成许多小的可执行程序。

2,实现资源共享

这里指的资源共享包括很多方面,最多的是内存共享、代码共享等等。DLL还有一个突出的特点就是在内存中只装载一次,这一点可以节省有限的内存,而且可以同时为多个进程服务。

3,便于维护和升级

在软件运行出现问题的时候,我们并不需要重新安装程序,只需要替换相应的DLL文件即可。

4,比较安全

这里说的安全也包括很多方面。比如,DLL文件遭受病毒的侵害机率要比普通的EXE文件低很多。另外,由于是动态链接的,这给一些从事破坏工作的“高手”们多少带来了一些反汇编的困难。



第二章 在Delphi中编写DLL文件

编写DLL文件其实不是什么困难的事情,和我们平时在Delphi中编写程序基本相似,下面先以一个简单的例子来说明。

procedure TForm1.btn1Click(Sender: TObject);type  Taddc = function: TStringList; stdcall;var  hh: THandle;  addc: Taddc;  temp: TStringList;  i: Integer;begin  hh := LoadLibrary('DLL.dll');  try    if hh <> 0 then      @addc := GetProcAddress(hh, PChar('testStr'));      if not (@addc = nil) then      begin        temp := addc;        for i := 0 to temp.Count - 1 do          showMessage(temp[i]);      end      else      begin        RaiseLastWin32Error;      end;  finally    FreeLibrary(hh);  end;end;

由上面代码可以看到,这种动态调用技术很复杂。但只要更改参数就可动态更改所调用Dll文件的名字。

1,在type中定义所要调用的函数或过程的类型,在这里同样也要加上stdcall参数。

2,释放Dll。在上面程序中我们使用LoadLibray函数加载了dll文件,在使用完Dll文件时切记调用FreeLibrary函数来释放Dll,否则Dll将会一直占用你的内存直至您退出Windows或是关机为止。在这里需要注意的是要确保在释放dll的时候没有任何指针指向该dll中所定义的变量、过程等,否则无法正常释放,招聘访问冲突异常。或是导致程序出现空指针,导致程序意外中止。

3,在动态调用的Dll函数中我们使用了string类型,由于在两处文件内都引用了ShareMem,所以string类型的数据可以正使用,以及作为参数来传递。

三,静态和动态调用的对比

1,静态方法实现简单,易于掌握。并且一般来说速度比较快,也更加安全可靠一些。但静态方法不能灵活地在运行时装卸所需的Dll,而主程序在开始运行时就装载了Dll只到程序结束时才释放该Dll。

2,动态方法很好地解决了静态方法中的不足,可以方便的访问Dll中的函数和过程。但动态方法难以完全掌握,使用时因为不同的函数或过程需要定义很多复杂的类型和调用方法。



读书人网 >.NET

热点推荐