主要在DLLProc中完成
procedure LibraryProc(Reason: Integer); //注意下面还要设置DllProc的
begin
//注意Reason的值:
// DLL_PROCESS_DETACH = 0;
// DLL_PROCESS_ATTACH = 1;
// DLL_THREAD_ATTACH = 2;
// DLL_THREAD_DETACH = 3;
//注意 DLL_PROCESS_ATTACH 是不会被自动调用的,初始化还是要写在begin ... end里面
// 其它三个,包括释放,是有用的
end;
begin
DLLProc:=@LibraryProc; //这个一个要写!!!!
//初始化代码这里写
//当然,你也可以这里调用一下 LibraryProc(DLL_PROCESS_ATTACH ),这样上面的函数功能就全了
end.
例子:
DLL工程
library Project2;
uses
SysUtils,
Classes,
Windows,
Unit1 in \'Unit1.pas\' {Form1};
{$R *.res}
var
slist:TStringList;
procedure LibraryProc(Reason: Integer); //注意下面还要设置DllProc的
begin
if Reason=DLL_PROCESS_DETACH then
begin
if Assigned(form1) then
freeandnil(form1);
slist:=TStringList.Create;
slist.Add(\'out\');
slist.SaveToFile(\'out.txt\');
slist.Free;
end;
end;
procedure Test; stdcall;
begin
if Assigned(form1) then
form1.ShowModal;
end;
exports
Test;
begin
DLLProc:=@LibraryProc;
form1:=Tform1.Create(nil);
slist:=TStringList.Create;
slist.Add(\'in\');
slist.SaveToFile(\'in.txt\');
slist.Free;
end.
调用DLL的工程
unit MainUnit1;
//DLL在加载和释放过程中做些事情
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
procedure Test; stdcall; external \'Project2.dll\';
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Test;
end;
end.
责任编辑:小草