在Delphi7下怎么与DLL共享数据库连接

在Delphi7下如何与DLL共享数据库连接

在Delphi7下如何与DLL共享数据库连接:
  exe里有DM:TDataModule1模块设置数据库连接,
  DLL里也有DM:TDataModule1模块设置数据库连接,
  我想把exe里DM:TDataModule1的地址传个DLL里的DM:TDataModule1;

  问题:我没调试出来,请各位帮忙!
部分代码如下:
DLL:
Delphi(Pascal) code
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:(初始化)
Delphi(Pascal) code
unit Init;

interface

implementation
uses DM,activex; //

initialization
  CoInitialize(nil);
  DataModule1:= TDataModule1.Create(nil);
finalization
  DataModule1.Free;
  CounInitialize;
end.

EXE程序调用DLL:
Delphi(Pascal) code
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直接传过去,在写dll接口函数的时候adoconnection这个参数不就可以了吗
------解决方案--------------------
同意二楼兄弟
只传ADOConnection就可以了

另外小心内存泄露!

------解决方案--------------------
用文件把数据库连接字符串传过去不行吗
------解决方案--------------------
exe和dll的.dpr文件的Uses语句中第一个引用单元一定要是ShareMem!!!
Delphi(Pascal) code
unit Init;

interface

implementation
uses DM,activex; //

initialization
  CoInitialize(nil);
  ////DataModule1:= TDataModule1.Create(nil); 删除,由Exe传入
finalization
  ////DataModule1.Free; 删除,由Exe传入
  CounInitialize;
end.

------解决方案--------------------
Delphi(Pascal) code

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;

------解决方案--------------------
还是自己试试吧
Delphi(Pascal) code

procedure ShowFrm(var dtm: TDataModule1);stdcall;//没有约定好调用方法
begin
  DataModule1:= dtm;
  Frmdll_conn:= tFrmdll_conn.Create(application);
  try
    Frmdll_conn.ShowModal;
  finally
    Frmdll_conn.Free;
  end;
end;