在Delphi7下如何与DLL共享数据库连接:
exe里有DM:TDataModule1模块设置数据库连接,
DLL里也有DM:TDataModule1模块设置数据库连接,
我想把exe里DM:TDataModule1的地址传个DLL里的DM:TDataModule1; 问题:我没调试出来,请各位帮忙!
部分代码如下:
DLL:
procedure Init(var dtm: TDataModule1);
begin
DataModule1:= dtm;
end;
//声名调用的过程名的DLL文件
procedure ShowFrm(var dtm: TDataModule1);
begin
DataModule1:= dtm;
Frmdll_conn:= tFrmdll_conn.Create(application);
try
Frmdll_conn.ShowModal;
finally
Frmdll_conn.Free;
end;
end;
exports
Init,ShowFrm;
begin
DLL里的Init:(初始化)
unit Init;interfaceimplementation
uses DM,activex; //initialization
CoInitialize(nil);
DataModule1:= TDataModule1.Create(nil);
finalization
DataModule1.Free;
CounInitialize;
end.
EXE程序调用DLL:
TYPE
TShowFrm = procedure (var dtm: TDataModule1); stdcall;
TInit = procedure (var dtm: TDataModule1); stdcall;
var
DLLHandle: THandle;procedure TForm1.DLL1Click(Sender: TObject);
var
AShowFrm: TShowFrm;
begin
@AShowFrm := GetProcAddress(DLLHandle, 'Init');
if Assigned(@AShowFrm) then
AShowFrm(DataModule1);
end;procedure TForm1.FormCreate(Sender: TObject);
VAR
AInit: TInit;
begin
DLLHandle := LoadLibrary('dll.dll'); @AInit := GetProcAddress(DLLHandle, 'Init');
if Assigned(@AInit) then
AInit(DataModule1);
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeLibrary(DLLHandle);
end;
只传ADOConnection就可以了另外小心内存泄露!
unit Init;interfaceimplementation
uses DM,activex; //initialization
CoInitialize(nil);
////DataModule1:= TDataModule1.Create(nil); 删除,由Exe传入
finalization
////DataModule1.Free; 删除,由Exe传入
CounInitialize;
end.
{procedure Init(var dtm: TDataModule1);
begin
DataModule1:= dtm;
end;}//这个函数可以不要
//声名调用的过程名的DLL文件
procedure ShowFrm(var dtm: TDataModule1);
begin
DataModule1:= dtm;
Frmdll_conn:= tFrmdll_conn.Create(application);
try
Frmdll_conn.ShowModal;
finally
Frmdll_conn.Free;
end;
end;
exports
{Init,}ShowFrm;
begin
TYPE
TShowFrm = procedure (var dtm: TDataModule1); stdcall;
////TInit = procedure (var dtm: TDataModule1); stdcall;
var
DLLHandle: THandle;procedure TForm1.DLL1Click(Sender: TObject);
var
AShowFrm: TShowFrm;
begin
///@AShowFrm := GetProcAddress(DLLHandle, 'Init');///这里也写错了,不是'Init'是'ShowFrm'
@AShowFrm := GetProcAddress(DLLHandle, 'ShowFrm');
if Assigned(@AShowFrm) then
AShowFrm(DataModule1);
end;procedure TForm1.FormCreate(Sender: TObject);
////VAR
/// AInit: TInit;
begin
DLLHandle := LoadLibrary('dll.dll');//// @AInit := GetProcAddress(DLLHandle, 'Init');
/// if Assigned(@AInit) then
/// AInit(DataModule1);
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeLibrary(DLLHandle);
end;
begin
DataModule1:= dtm;
end;}//这个函数可以不要
//声名调用的过程名的DLL文件
procedure ShowFrm(var dtm: TDataModule1);
begin
DataModule1:= dtm;//执行到这里的时候有内存错误
Frmdll_conn:= tFrmdll_conn.Create(application);
try
Frmdll_conn.ShowModal;
finally
Frmdll_conn.Free;
end;
end;
exports
{Init,}ShowFrm;
begin
[email protected]
begin
DataModule1:= dtm;
Frmdll_conn:= tFrmdll_conn.Create(application);
try
Frmdll_conn.ShowModal;
finally
Frmdll_conn.Free;
end;
end;