在Delphi7下如何与DLL共享数据库连接
在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
unit Init;interfaceimplementationuses DM,activex; //initialization CoInitialize(nil); DataModule1:= TDataModule1.Create(nil);finalization DataModule1.Free; CounInitialize;end.
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;unit Init;interfaceimplementationuses DM,activex; //initialization CoInitialize(nil); ////DataModule1:= TDataModule1.Create(nil); 删除,由Exe传入finalization ////DataModule1.Free; 删除,由Exe传入 CounInitialize;end.
[解决办法]
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;
[解决办法]
还是自己试试吧
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;