-----------------Dll难题,请指教----------------十万火急了,大过年的,兄弟们帮俺瞧瞧吧 ( 积分: 100 )

  • 主题发起人 主题发起人 happycyp
  • 开始时间 开始时间
H

happycyp

Unregistered / Unconfirmed
GUEST, unregistred user!
开发环境(Win2000 + Delphi7), 三层结构。

遇到一个问题,在主程序调用Dll的窗体时,在开发的机子上调用都没有问题,
在分发到其他电脑上,有时候窗体显示不出来,停止响应;有时候进行操作时,停止响应。
测试两台机子发现如下情况:
(1)电脑1: XP系统,在操作时,打开Dll窗体时,停止响应,将主程序程序最小化,在桌面刷新几下就会马上打开窗体,否则将一直没有响应,或者要很长时间才会打开。
(2)电脑2: Win2003,在操作时,打开Dll窗体,有时候可以打开,有时候没有响应,有时候在dll窗体中操作时,就停止响应。

经调试发现,已经从中间层取得数据,停止响应应该是在本机客户端造成的。
Midas.dll, borlndmm.dll,都随主程序一同分发。

代码:
unit uStockExports;

interface

uses
ShareMem, SysUtils, Windows, Forms, Controls, Classes, SysUnit;

var
App: TApplication;
Scn: TScreen;
HintWindow: THintWindowClass;

implementation

uses
uStockPlanBill;

function StockPlanBill(AOwner: TApplication; D_Hint: THintWindowClass;
UI: TUserInfo; SendScreen: TScreen): TFmStockPlanBill; stdcall;
begin
try
Application := AOwner;
if SendScreen <> nil then
Screen := SendScreen; //传入Screen对象以使主程序的MDIChild正常增加
HintWindowClass := D_Hint;
Application.ProcessMessages;
Result := FmStockPlanBill ;
if not Assigned(Result) then
Result := TFmStockPlanBill.Create(AOwner);
Result.Caption := '采购计划申请单';
Result.IsAudit := False;
Result.FormStyle := fsMDIChild;
Result.WindowState := wsMaximized;
Result.Show;
except on E : Exception do
begin
if Assigned(FmStockPlanBill) then FmStockPlanBill.Free ;
Application.MessageBox (PChar(E.Message),'出错',MB_OK + MB_ICONERROR);
Result := nil;
end;
end;
end;

procedure DLLEntryPoint(dwReason: DWord); register;
begin
case dwReason of
DLL_PROCESS_ATTACH: begin
App := Application;
Scn := Screen;
HintWindow := HintWindowClass;
end;
DLL_PROCESS_DETACH: begin
Application := App;
Screen := Scn;
HintWindowClass := HintWindow;
end;
DLL_THREAD_ATTACH: ;
DLL_THREAD_DETACH: ;
end;
end;


exports
StockPlanBill;


initialization
DLLProc := @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);

finalization
Screen := Scn;
Application := App;
HintWindowClass := HintWindow;

end.
请各位高人给指指招。谢谢了。
 
你试试以带包的方式编译你的EXE和DLL试试
发布的时候,注意带着Delphi的那些包
另外 ShareMem 应该放在工程文件中的第一个的位置,而不是单元的第一个位置。
 
主程序和Dll都是带包编译的。只保留了的Vcl70.bpl,并且随程序一同发布的。
工程文件里的第一个也是引用的ShareMem.
 
发现没有响应好像发生Socket上连接上
 
我在用asta做开发时,也有类似的问题,后来通过下面的方法解决了,希望对你有帮助
asta的控件是写在dll中的。关键在于那个while
begin
f_dm.CS.CloseTheSocket;
f_dm.CS.Close;
f_dm.CS.OpenTheSocket;
sleep(80);
FirstTickCount := GetTickCount;
while not f_dm.CS.Active do
begin
Application.ProcessMessages;
if ((GetTickCount - FirstTickCount) >= LongInt(5000)) then
begin
MessageDlg('Socket连接失败,无法从服务器取回数据!', mtInformation, [mbOk], 0);
Break;
end;
end;
end;
 
做了类似的修改,问题仍旧。
 
我个人觉得应该是fsMDIChild的问题,因为如果我在设计时使用fsMDIChild时,它是直接把窗体的Visible设置为true了,而且不再用调用Show方法。所以我觉得问题可能就是这个
 
請問你的客戶端調用是如何實現的?
在調用dll時要注意delphi能使用的變量參數,在返回結果時會同windows系統變量有不兼容的情況。
如:dll中不能傳遞Tclientdataset變量一旦數據量大的時候就導致執行程序異常。
一般采用:OleVariant變量來實現。
 
不是楼上说的问题。
dll带包编译你们一般都哪些个包
我原来只带了vcl70.bpl,后来加上了rtl70.bpl,在XP中打开情况大有好转。
但是在操作时,还有没有响应的情况。在桌面单击右鼠标右健,程序就又恢复正常,继续响应!
非常郁闷,纳闷。苍天呀,大地呀,谁能帮帮俺。
 
dll加载(DLL_PROCESS_ATTACH)时App:=Application?
Application没有赋值!

dll加卸载时Application:=App; App:=Not Assigned。。。

你必须在Dll中Exports一个函数,用这个函数来显示地给Dll中的 窗体的Application 赋值!
比如:
procedure SetApp(AAppHandle:Thandle);
begin
Application=AAppHandle;
end;

exports SetApp;
在使用任何Dll函数前,调用SetApp!
 
linuxping网友的代码有一些小小的问题,正确的例子是:

procedure SetApp(AAppHandle:Thandle);stdcall;
begin
Application.Handle:=AAppHandle;//此Application变量是Dll的
end;

exports SetApp;

其中参数AAppHandle为主调程序的Application的Handle值。
 
不是这里的问题,程序在Win2000里没有问题,在XP和2003中才会出现问题。
 
我汗,用Delphi2006编译一次,问题解决了(目前几台机器没有问题)。晕
 
多人接受答案了。
 
后退
顶部