在Delphi7下怎么与DLL共享数据库连接
在Delphi7下如何与DLL共享数据库连接
在Delphi7下如何与DLL共享数据库连接:
exe里有DM:TDataModule1模块设置数据库连接,
DLL里也有DM:TDataModule1模块设置数据库连接,
我想把exe里DM:TDataModule1的地址传个DLL里的DM:TDataModule1;
问题:我没调试出来,请各位帮忙!
部分代码如下:
DLL:
DLL里的Init:(初始化)
EXE程序调用DLL:
------解决方案--------------------
你传递一个指针过去不好么?
------解决方案--------------------
你把ADOConnection直接传过去,在写dll接口函数的时候adoconnection这个参数不就可以了吗
------解决方案--------------------
同意二楼兄弟
只传ADOConnection就可以了
另外小心内存泄露!
------解决方案--------------------
用文件把数据库连接字符串传过去不行吗
------解决方案--------------------
exe和dll的.dpr文件的Uses语句中第一个引用单元一定要是ShareMem!!!
在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;