在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;

解决方案 »

  1.   

    你把ADOConnection直接传过去,在写dll接口函数的时候adoconnection这个参数不就可以了吗
      

  2.   

    同意二楼兄弟
    只传ADOConnection就可以了另外小心内存泄露!
      

  3.   

    exe和dll的.dpr文件的Uses语句中第一个引用单元一定要是ShareMem!!!
    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
      

  4.   


    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;
      

  5.   

    {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
      

  6.   

    发个Delphi7下如何与DLL共享数据库连接示例给我也行
    [email protected]
      

  7.   

    还是自己试试吧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;