DLL高手过来帮忙(100分)

  • 主题发起人 主题发起人 tdp
  • 开始时间 开始时间
T

tdp

Unregistered / Unconfirmed
GUEST, unregistred user!
做了一个使用DLL的程序,在DLL里的Form中打开数据库。
已经做的差不多了,发现调用DLL的窗体在任务中没有显示,主程序在任务栏中也消失了,如果showmessage的话,任务栏中又显示了。
上面的程序只传了Application对象到DLL,查资料后试了一下传Screen对象到DLL,结果任务栏里DLL和EXE都正常显示,但出现了更奇怪的现象,所有数据感知组件(dbgrid, nav,等)都不能显示数据了,数据库打开了,连接也肯定正确,就是一点反应都没有。
试试取消传Screen对象到DLL,数据库打开显示正常。又回到最初的情况。
 
贴出源码来看看
 
var
DllApp: TApplication;
procedure MyDLLProc(Reason: Integer);
begin
if Reason = DLL_PROCESS_DETACH then
begin
Application := DllApp;
end;
end;
procedure InitDLL(App:TApplication);stdcall;
begin
Application := App;
Application.CreateForm(TFrm_dll, Frm_dll);
end;
exports
InitDLL, ShowFrm, SetSkin;
begin
DllApp := Application;
DLLProc := @MyDLLProc;
end.
================================================
procedure ShowFrm(_Frm_Return: TForm);stdcall;
begin
Frm_dll.Frm_Return := _Frm_Return;
Frm_dll.Show;
_Frm_Return.Hide;
end;

procedure TFrm_dll.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Frm_Return.Show;
end;

调用ShowFrm后任务栏里就不显示了,使用ShowMessage可以让任务栏显示
我想可能是Application对象对窗体的管理上有一点问题。但传递Screen对象后所有数据感知组件都不能显示数据了,真是让人摸不着头脑!!!
烦呀,快来帮忙
 
发现一些新的情况,如果acon,aqry,datasource和表格在同一个窗体则可以正常显示数据,
如果把数据源放到另一个DataModule中就不行了。
另外下面函数中show和hide的顺序对任务栏显示也有影响
ShowFrm(_Frm_Return: TForm);stdcall;
begin
Frm_dll.Frm_Return := _Frm_Return;
Frm_dll.Show;
_Frm_Return.Hide;
end;
 
带包编译吧,Application和Screen都不用传了,就跟在同一个Project里一样用了。
DLL和Exe都编译的时候都选中 Build with runtime packages。
 
不想带包编译,看看有没有其它方法。
我现在的结果是,传Application和Screen保证窗口显示正确,然后程序运行时重设数据感知组的Datasource属性就可以正常显示数据了。
现在就是不明白为什么Screen对象会影响数据感知组件自动连接Datasource
 
后退
顶部