本文包括如下话题:
- 导出分句
- 动态链接库初始化
- 全局变量
- 库和系统变量
1.使用导出分句
下面是的例子是用动态链接库(dll)编写的两个函数,Min和Max
Code
library MinMax;
function Min(X, Y: Integer): Integer; stdcall;
begin
if X < Y then Min := X else Min := Y;
end;
function Max(X, Y: Integer): Integer; stdcall;
begin
if X > Y then Max := X else Max := Y;
end;
exports
Min,
Max;
begin
end.
library MinMax;
function Min(X, Y: Integer): Integer; stdcall;
begin
if X < Y then Min := X else Min := Y;
end;
function Max(X, Y: Integer): Integer; stdcall;
begin
if X > Y then Max := X else Max := Y;
end;
exports
Min,
Max;
begin
end.
2.动态链接库初始化
1)动态链接库的初始化代码的DllProc函数在动态链接库第一加载到内存,一个线程启动或停止,或者一个动态链接库卸载的时候执行。
2)调用动态链接库的单元的初始话代码在动态链接库初始化代码执行后执行
3)动态链接库的结束代码在单元代码结束代码执行前执行。
Code
library Test;
var
SaveDllProc: Pointer;
procedure LibExit(Reason: Integer);
begin
if Reason = DLL_PROCESS_DETACH then
begin
.
. // library exit code
.
end;
SaveDllProc(Reason); // call saved entry point procedure
end;
begin
.
. // library initialization code
.
SaveDllProc := DllProc; // save exit procedure chain
DllProc := @LibExit; // install LibExit exit procedure
library Test;
var
SaveDllProc: Pointer;
procedure LibExit(Reason: Integer);
begin
if Reason = DLL_PROCESS_DETACH then
begin
.
. // library exit code
.
end;
SaveDllProc(Reason); // call saved entry point procedure
end;
begin
.
. // library initialization code
.
SaveDllProc := DllProc; // save exit procedure chain
DllProc := @LibExit; // install LibExit exit procedure
3.动态链接库的全局变量
动态链接库中的全局变量不能导出到Delphi应用程序。
4.系统变量(用作动态链接库回调函数的返回值)
DLL_PROCESS_DETACH
|
Indicates that the library is detaching from the address space of the calling process as a result of a clean exit or a call to
FreeLibrary. (动态链接库卸载)
|
DLL_PROCESS_ATTACH
|
Indicates that the library is attaching to the address space of the calling process as the result of a call to
LoadLibrary. (动态链接库加载)
|
DLL_THREAD_ATTACH
|
Indicates that the current process is creating a new thread. (动态链接库进入一个新线程)
|
DLL_THREAD_DETACH
|
Indicates that a thread is exiting cleanly. (动态链接库从一个线程退出)
|
5.异常处理
1)用Delphi调用Delphi编写的DLL可以使用 try...except 捕获
2)其他语言调用Delphi编写的Dll可以使用系统变量$0EEDFADE,它是一个数组,第一个入口地址是异常的系统地址,第二个入口是Delphi异常对象( Delphi exception object)。
注意:
如果不使用SysUtils单元,异常机制将不起作用。当程序发生异常时,应用程序会从系统中退出。
6.在Win32下动态链接库的共享内存管理
如果动态链接库数据的数据类型是应用类型(比如:long strings,动态数组,对象,结构体等等),则客户程序必须引用ShareMem单元。