DLL技术应用02
让编程改变世界
Change the world by program
DLL的编写
在Delphi环境中,编写一个DLLs和编写一个一般的应用程序并没有太大的区别。 事实上作为DLLs主体的DLL函数的编写,除了在内存、资源的管理上有所不同外,并不需要其他特别的手段。 根据DLL完成的功能,我们把DLL分成三类:完成一般功能的DLL、用于数据交换的DLL和用于窗体重用的DLL。 下面通过一个实际的例子来讲解完成一般功能的DLL的编写方法。 要求:创建一个DLL,该DLL中包含两个函数,分别用于求三个数的最大值和最小值。 小甲鱼一边讲一边给大家演示:步骤一:建立DLL程序框架
[caption id="attachment_684" align="aligncenter" width="680"] 一般工程文件和DLL工程文件区别[/caption] 注意注释的中文含义: 在DLL中,如果导出过程或函数的参数为字符串或动态数组,或者函数的返回值为字符串或动态数组,则在uses语句中应包含ShareMem单元,要将ShareMem单元放在最前。ShareMem是共享的内存管理器Borlandmm.dll的接口单元,Borlandmm.dll必须一起发布。另外一种解决办法就是利用PChar或ShortString类型来传递字符串信息,可以不用在uses语句中包含ShareMem单元。
步骤二:建立过程和函数
注意:定义函数时使用的“stdcall”是一种调用约定,如果程序员希望自己的DLL库函数能够被其他程序设计语言的程序调用,应使用stdcall调用约定。 默认的调用约定为register,该约定是最快的参数传递约定,但其他程序设计语言可能不支持该调用约定。 主要的调用约定关键字如表: [caption id="attachment_686" align="aligncenter" width="680"] 主要的调用约定关键字[/caption] DLL的过程和函数想要在外部被使用,要用Exports语句声明供其他应用程序调用的函数和过程名。 可以利用标准指示name、Index、resident以方便和加速过程、函数的调用。name
name后面接一个字符串常量,作为该过程或函数的输出名。 如: exportsInStr name 'MyInstr';
其他应用程序将用新名字(MyInstr)调用该过程或函数。 如果仍利用原来的名字(InStr),则在程序执行到引用点时会引发一个系统错误。Index
Index指示为过程或函数分配一个顺序号。 如果不使用Index指示,则由编译器按顺序进行分配。 Index后所接数字的范围为1~32767。 使用Index可以加速调用过程。resident
使用resident,则当DLLs装入时特定的输出信息始终保持在内存中。 这样当其他应用程序调用该过程时,可以此利用名字扫描DLL入口以降低时间开销。 对于那些其他应用程序常常要调用的过程或函数,宜于使用resident 指示。例如: exportsInStr name 'MyInStr' resident;
注意: exports子句可以出现在程序的声明部分,也可以出现在单元文件的interface或implementation中的任意位置,出现的次数也没有限制。 但一般来说,程序中很少使用exports语句。 当要输出重载的函数或过程时,必须要在exports 子句中起别名和指明参数列表,例如: exportsMax(x,y,z:integer) Name 'MaxInt';
Max(x,y,z:Real) Name 'MaxReal';
[buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LOMENNFQKIRV']视频下载[/Downlink]