主程序与DLL之间的全局变量
1. 在Project1.Form1 上拖一 Button
整个 Unit1 源码如下
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IDataModule, StdCtrls, DB, ADODB, Grids, DBGrids;
type
TForm1 = class(TForm)
Button2: TButton;
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TFunSetIDM = function(aIDM : TIDM) : Boolean;
TFunShowForm = function(App : TApplication) : TForm;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
var
h : THandle;
FSI : TFunSetIDM;
FSF : TFunShowForm;
begin
h := LoadLibrary('Dll.Dll');
FSI := getprocaddress(h, 'SetIDM');
FSF := getprocaddress(h, 'ShowForm');
FSI(IDM);
FSF(Application);
end;
end.
2. 创建一 DataModule 托一 TADOConnection 控件
DataModule 源码
unit DataModule;
interface
uses
SysUtils, Classes, DB, ADODB, IDataModule;
type
TDM = class(TDataModule, TIDM)
ADOConnection1: TADOConnection;
private
{ Private declarations }
public
{ Public declarations }
function GetConn : TADOConnection;
end;
implementation
{$R *.dfm}
{ TDM }
function TDM.GetConn: TADOConnection;
begin
Result := ADOConnection1;
end;
end.
3.创建一 空的单元命名 IDataModule
IDataModule 源码
unit IDataModule;
interface
uses ADODB;
type
TIDM = interface
['{CE4B0AA7-CE04-4F67-A107-409A5F9DC184}']
function GetConn : TADOConnection;
end;
var
IDM : TIDM;
implementation
end.
4.修改 Project1 源码 如下
program Project1;
uses
Forms,
DataModule in 'DataModule.pas' {DM: TDataModule},
IDataModule in 'IDataModule.pas',
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
//Application.CreateForm(TDM, IDM); 注释
IDM := TDM.Create(Application); 修改过后
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
5.新建 dll
dll 源码
library DLL;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
SysUtils,
Classes,
Forms,
IDataModule in 'IDataModule.pas',
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
function SetIDM(aIDM : TIDM) : Boolean;
begin
try
IDM := aIDM;
Result := True;
except
Result := False;
end;
end;
function ShowForm(App : TApplication) : TForm;
begin
Application := App;
Result := TForm(TForm2.Create(Application));
Result.Show;
end;
exports
SetIDM,
ShowForm;
begin
end.
6.dll form 源码
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids, IDataModule;
type
TForm2 = class(TForm)
DBGrid1: TDBGrid;
Button1: TButton;
ADODataSet1: TADODataSet;
DataSource1: TDataSource;
procedure Button1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
if IDM.GetConn.Connected then
begin
IDM.GetConn.Close;
end
else
begin
IDM.GetConn.Open;
ADODataSet1.Connection := IDM.GetConn;
ADODataSet1.Active := True;
end;
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := cafree;
end;
procedure TForm2.FormShow(Sender: TObject);
begin
IDM.GetConn.Close;
end;
end.
7.还有一 在dll 在引 一 IDataModule.pas 单元即可
📱 扫码关注公众号
扫描二维码关注我们,获取更多精彩内容
实时更新 · 干货满满




