生成动态链接库

1、打开 Delphi7,新建“DLL Wizard”。

变量 描述
ExitProc 退出处理的过程指针,可设为自定义的过程
ExitCode 退出时的状态

2、在 Begin ... End 中写入初始化部分,一般不需要。

原为 LibMain 过程。

var
    SaveExit: Pointer;
begin
    {DLL的初始化工作 }
    SaveExit := ExitProc; { 保存原来的退出过程指针 }
    ExitProc := @LibExit; { 安装新的退出过程 }
end.

3、编写函数/过程代码。

function FuncName(...):ResultType; far; stdcall;
begin
   ...
   result = ...;
end;

procedure ProcName(...); far; stdcall;
begin
   ...
end;

4、导出函数/过程代码,使外部程序可调用。

也可在函数定义后附加 export 指示。

exports

    FuncName [name 'myfuncA'] [Index n] [resident];
    ProcName [name 'myprocA'] [Index n] [resident];

参数 描述
name 过程或函数的输出名
Index 顺序号,可以加快调用过程,[1..32767]
resident 用于使用频率较高的过程

5、编写退出代码,必须使用 LibExit 名称。

原为 WEP 过程。

procedure LibExit; far;
begin
    if ExitCode = wep_System_Exit then
    begin
        { 系统关闭时的相应处理 }
    end
    else
    begin
        { DLL 卸出时的相应处理 }
    end;
    ExitProc := SaveExit; { 恢复原来的退出过程指针 }
end; 

6、编译

注:

1、使用字符串参数时用:PChar,以 C 语言规则用 \0 标志字符串结束;

ExitCode

ExitCode 描述
WEP_System_Exit   Windows 关闭
WEP_Free_DLLx  DLLs 被卸出

内存分配,使用 gmem_DDEShare 参数后此内存会随应用程序终止自动释放。

var
    hMem : THandle;

hMem := GlobalAlloc(gmem_MOVEABLE and gmem_DDEShare,num);
if mMem=0 then "内存分配失败!"

示例:

library Test;

{$S-}

uses WinTypes, WinProcs;
var
    SaveExit: Pointer; 

procedure LibExit; far;
begin
    if ExitCode = wep_System_Exit then
    begin
        { 系统关闭时的相应处理 }
    end
    else
    begin
        { DLL卸出时的相应处理 }
    end;
    ExitProc := SaveExit; { 恢复原来的退出过程指针 }
end; 

begin
    {DLL的初始化工作 }
    SaveExit := ExitProc; { 保存原来的退出过程指针 }
    ExitProc := @LibExit; { 安装新的退出过程 }
end.