DLL 的datamodule问题 (100分)

  • 主题发起人 主题发起人 rester
  • 开始时间 开始时间
R

rester

Unregistered / Unconfirmed
GUEST, unregistred user!
我在DLL中需要用到一个数据模块.数据模块名为dmdll, 在Library中如下定义:

var
dmdll: Tdmdll

procedure ShowDllAdoForm(MainApp:TApplication; MainAdoConnection:TADOConnection); stdcall;
var
Child:TForm1;
begin
Application:=MainApp;
dmdll := Tdmdll.Create(nil) ;
with dmdll do
begin
ADOQuery1.Connection := MainAdoConnection;
adoquery1.Active := True;
end;
end;

这样在dll中的一个form中用到此adoquery1时,adoquery是打开的,但现在我想在form中打开
在form中用dmdll.adoquery1.Active := True时系统报错. 我想原因可能是dmdll是在library中定义,
未传入到form中去,但是怎么才能在dll中某一个form中实现打开或关闭dmdll中的数据集.

第2个问题,我想在dll中的form中调用主程序的一个函数,如果不用回调函数, 用getprocaddress,如何得
到此函数有handle.


 
注意你的Application指针,Dll的Application指针不同于应用程序。请看下列示例,要特别注意加 **** 标记的行:

//函数定义
function ShowPerSN(AHandle: THandle; ACaption: String):BOOL;
var
FormPERSON: TFormPERSON; //定义窗体类(上面的放到了此处)
begin
// Copy application handle to DLL's TApplication object
//拷贝应用程式句柄给DLL的应有程式对象
Application.Handle := AHandle; {******* 注意此行}
FormPERSON := TFormPERSON.Create(Application);//创建控件TForm
try
FormPERSON.Caption := ACaption;
FormPERSON.ShowModal;//显示此Form
// Pass the date back in Result
Result := False; //反回成功值
finally
FormPERSON.Free;
end;
end;

在主程序中调用上述的DLL函数:
procedure TMAINCLTR.ToolButton1Click(Sender: TObject);
var //按钮的调用事件:调用过程
LibHandle: THandle;
ShowPerSN: TShowPerSN;
begin
Application.Title:='人力资源管理系统DLL文件测试程式';
{ Attempt to load the DLL 尝试装入DLL文件}
LibHandle := LoadLibrary('MGRPERSN.DLL');
try
if LibHandle = 0 then
raise EDLLLoadError.Create('Unable to Load DLL(无法成功装入MGRPERSN.DLL)');
@ShowPerSN := GetProcAddress(LibHandle, 'ShowPerSN');
if not (@ShowPerSN = nil) then
ShowPerSN(Application.Handle, '人事资料管理')//呼叫出窗体 ***** 注意此行
else
RaiseLastWin32Error;
finally
FreeLibrary(LibHandle); // Unload the DLL.
end;
end;
 
to sharejoy :
在dll中传application或application.handle都可以使dll的application为主application,但解决不了我说的问题.
我已解决第1个问题:只要将dmdll设为全局变量就可以,

但第2个问题,如何解决? 在主程序中,如何自定义属于application的过程或函数?


 
你的第2个问题:“想在dll中的form中调用主程序的一个函数,如果不用回调函数, 用getprocaddress,
如何得到此函数有(的)handle.”
getprocaddress只能取DLL中的函数指针,不能取应用程序中函数的指针。对于此类问题,写回调函数
依然是经典的方法。

至于你的新问题:application是TApplication实例,由VCL自行创建,只允许你接管它的一些事件处理
,最好不要打它的主意,改打主窗口或公共函数的主意吧。
 
接受答案了.
 
后退
顶部