选择显示字体大小

delphi中dll的创建和使用(1)

一 为什么要使用动态链接库(dll



提起dll您一定不会陌生,在windows中有着大量的以dll为后缀的文件,它们是保证windows正常运行和维护升级的重要保证。(举个例子,笔者的win95 system目录下尽有500多个dll文件。)其实,dll是一种特殊的可执行文件。说它特殊主要是因为一般它都不能直接运行,需要宿主程序比如*.exe程序或其他dll的动态调用才能够使用。简单的说,在通常情况下dll是经过编译的函数和过程的集合。

使用dll技术主要有以下几个原因:

1、减小可执行文件大小。

 

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

2、实现资源共享。



这里指的资源共享包括很多方面,最多的是内存共享、代码共享等等。早期的程序员经常碰到这样的事情,在不同的编程任务中编写同样的代码。这种方法显然浪费了很多时间,为了解决这个问题人们编写了各种各样的库。但由于编程语言和环境的不同这些库一般都不能通用,而且用户在运行程序时还需要这些库才行,极不方便。dll的出现就像制定了一个标准一样,使这些库有了统一的规范。这样一来,用不同编程语言的程序员可以方便的使用用别的编程语言编写的dll。另外,dll还有一个突出的特点就是在内存中只装载一次,这一点可以节省有限的内存,而且可以同时为多个进程服务。

3、便于维护和升级。



细心的朋友可能发现有一些dll文件是有版本说明的。(查看dll文件的属性可以看到,但不是每一个dll文件都有)这是为了便于维护和升级。举个例子吧,早期的win95中有一个bug那就是在闰年不能正确显示229日这一天。后来,microsoft发布了一个补丁程序纠正了这个bug。值得一提的是,我们并没有重装win95,而是用新版本的dll代替了旧版本的dll。(具体是哪一个dll文件笔者一时想不起来了。)另一个常见的例子是驱动程序的升级。例如,著名的directx就多次升级,现在已经发展到了6.0版了。更妙的是,当我们试图安装较低版本的dll时,系统会给我们提示,避免人为的操作错误。例如我们升级某硬件的驱动程序时,经常碰到windows提示我们当前安装的驱动程序比原来的驱动程序旧。

4、比较安全



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

二 在delphi中编写dll

注意:在这里笔者假定读者使用的是delphi 3delphi 4开场白说了那么多,总该言归正传了。编写dll其实也不是一件十分困难的事,只是要注意一些事项就够了。为便于说明,我们先举一个例子。

library delphi;

uses

sysutils,

classes;

function testdll(i:integer):integer;stdcall;

begin

result:=i;

end;

exports

testdll;

begin

end.

上面的例子是不是很简单?熟悉delphi的朋友可以看出以上代码和一般的delphi程序的编写基本是相同的,只是在testdll函数后多了一个stdcall参数并且用exports语句声明了testdll函数。只要编译上面的代码,就可以得到一个名为delphi.dll的动态链接库。现在,让我们来看看有哪些需要注意的地方。一、在dll中编写的函数或过程都必须加上stdcall调用参数。在delphi 1delphi 2环境下该调用参数是far。从delphi 3以后将这个参数变为了stdcall,目的是为了使用标准的win32参数传递技术来代替优化的register参数。忘记使用stdcall参数是常见的错误,这个错误不会影响dll的编译和生成,但当调用这个dll时会发生很严重的错误,导致操作系统的死锁。原因是register参数是delphi的默认参数。

二、所写的函数和过程应该用exports语句声明为外部函数。

正如大家看到的,testdll函数被声明为一个外部函数。这样做可以使该函数在外部就能看到,具体方法是单激鼠标右键用“快速查看(quick view)”功能查看该dll文件。(如果没有“快速查看”选项可以从windows cd上安装。)testdll函数会出现在export table栏中。另一个很充分的理由是,如果不这样声明,我们编写的函数将不能被调用,这是大家都不愿看到的。

三、当使用了长字符串类型的参数、变量时要引用sharemem

delphi
中的string类型很强大,我们知道普通的字符串长度最大为256个字符,但delphistring类型在默认情况下长度可以达到2g。(对,您没有看错,确实是两兆。)这时,如果您坚持要使用string类型的参数、变量甚至是记录信息时,就要引用sharemem单元,而且必须是第一个引用的。既在uses语句后是第一个引用的单元。如下例:


uses

sharemem,

sysutils,

classes;

还有一点,在您的工程文件(*.dpr)中而不是单元文件(*.pas)中也要做同样的工作,这一点delphi自带的帮助文件没有说清楚,造成了很多误会。不这样做的话,您很有可能付出死机的代价。避免使用string类型的方法是将string类型的参数、变量等声明为pcharshortstring(如:s:string[10])类型。同样的问题会出现在当您使用了动态数组时,解决的方法同上所述。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons