10.2.1.6 编写一般DLLs的应用举例
在下面的程序中我们把一个字符串操作的函数储存到一个DLLs中,以便需要的时候调用它。应该注意的一点是:为了保证这个函数可以被其它语言编写的程序所调用,作为参数传递的字符串应该是无结束符的字符数组类型(即PChar类型),而不是Object Pascal的带结束符的Srting类型。程序清单如下:
library Example;
uses
SysUtils,
Classes;
{返回字符在字符串中的位置}
function InStr(SourceStr: PChar;Ch: Char): Integer; export;
var
Len,i: Integer;
begin
Len := strlen(SourceStr);
for i := 0 to Len-1 do
if SourceStr[i] = ch then
begin
Result := i;
Exit;
end;
Result := -1;
end;
exports
Instr Index 1 name 'MyInStr' resident;
begin
end.
10.2.2 调用DLLs
有两种方法可用于调用一个储存在
DLLs中的过程。1.静态调用或显示装载
使用一个外部声明子句,使
DLLs在应用程序开始执行前即被装入。例如:function Instr(SourceStr : PChar;Check : Char); Integer; far; external 'UseStr';
使用这种方法,程序无法在运行时间里决定
DLLs的调用。假如一个特定的DLLs在运行时无法使用,则应用程序将无法执行。2.动态调用或隐式装载
使用
Windows API函数LoadLibray和GetProcAddress可以实现在运行时间里动态装载DLLs并调用其中的过程。若程序只在其中的一部分调用
DLLs的过程,或者程序使用哪个DLLs, 调用其中的哪个过程需要根据程序运行的实际状态来判断,那么使用动态调用就是一个很好的选择。使用动态调用,即使装载一个
DLLs失败了,程序仍能继续运行。10.2.3 静态调用
在静态调用一个DLLs中的过程或函数时,external指示增加到过程或函数的声明语句中。被调用的过程或函数必须采用远调用模式。这可以使用far过程指示或一个{$F }编译指示。
Delphi全部支持传统Windows动态链接库编程中的三种调用方式,它们是:
● 通过过程/函数名
● 通过过程/函数的别名
● 通过过程/函数的顺序号
通过过程或函数的别名调用,给用户编程提供了灵活性,而通过顺序号(Index)调用可以提高相应DLL的装载速度。
10.2.4 动态调用
10.2.4.1 动态调用中的API函数
动态调用中使用的Windows API函数主要有三个,即:Loadlibrary,GetProcAddress和Freelibrary。
1.Loadlibrary: 把指定库模块装入内存
语法为:
function Loadlibrary(LibFileName: PChar): THandle;
LibFileName指定了要装载DLLs的文件名,如果LibFileName没有包含一个路径,则Windows按下述顺序进行查找:
(1)当前目录;
(2)Windows目录(包含win.com的目录)。函数GetWindowDirectory返回这一目录的路径;
(3)Windows系统目录(包含系统文件如gdi.exe的目录)。函数GetSystemDirectory返回这一目录的路径;
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




