====DLL高手请进,调用DLL中的窗体假死,郁闷了好几个月了,万分火急====== ( 积分: 300 )

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

happycyp

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

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

代码见:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3673327

难道是在2000中编译的程序在XP或者2003中的兼容性不好?现在发现在2000的机子上也有时候会假死,在我的机子(开发环境)上没事。
用的是SocketConnection与中间层通信。
客户端没有通过DataSetProvider连接的,取数存数都是通过:
SocketCon.AppServer.GetXXXX
SocketCon.AppServer.SaveXXXX
方法进行操作的。

不知道为什么,总是假死,马上要上软件了,还没有解决好。谁能解决,将万分感谢!
 
我也是用三层调用。
dll里用的是mdichild form,没有出现你说的现象。
 
老兄,你是怎么做的呀。我的大概代码在另一个贴子里,上面有地址,帮忙看一下。谢谢。
 
to LanHer:
对你在DLL中创建MIDchild form感兴趣,贴点代码看看
 
你带包编译不用传app和scr
 
谢谢楼上的关注:不传也是一样的效果。
 
你如果已经带包编译,那就跟开发一个程序没什么两样的
注意EXE与DLL都是带包编译
然后不用uses ShareMem,也不用传什么Application,Screen。
 
关键是不传也是一样的效果呀。
 
你的dll中没有消息循环,所以窗口有时显示,有时不显示!
 
dll中的消息循环是有的。带包编译和普通程序的处理一样的。
有同事发现不用Dll的客户端也会出现假死,过一段时间就会响应。
不过,和我的那个症状不一样。真晕。
 
应该不是窗口的问题,可能是SocketConnection的问题
首先得让错误重现在你机器上才能调试
 
调试从来不会发生假死。[:(][:(][:(]
 
看看我很久以前写的调用,也许对你有用.
连接地址:http://www.delphibbs.com/keylife/iblog_show.asp?xid=12229

unit Unit4;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Unit3;

procedure LoadFrm(App: TApplication; Scr: TScreen); StdCall;
implementation
procedure LoadFrm(App: TApplication; Scr: TScreen );
var
LPtr: PLongint;
begin
if Form3 <> nil then Exit;
Application := App;
Screen := Scr;
LPtr := @Application.MainForm;
LPtr^ := Longint(App.MainForm);
Form3 := TForm3.Create(App.MainForm);
Form3.Show;
end;
end.
 
唯一不同就是你装载DLL的TForm时没有替换DLL的MainForm, 因为MdiChild的管理是由MainForm来管理的. 试试看看吧
 
试过了,不是这里的问题。还是会假死。
 
晕! 那你先把使用到三层的控件停用进行测试. 一个一个排除就不出来结果了.
比如把SocketConnection 等之类的东都停止使用.单调用dll的TForm出来.看它还
死不.
 
//加载
function TFmMain.DynaLoadDll(const AFileName: string): THandle;
var
index: Integer;
begin
//从程序包列表中按AFileName查找,如果找到直接返回程序包的句柄
//if FDllList.Find(AFileName, index) then
index := FDllList.IndexOf(AFileName);
if index > 0 then
Result := THandle(FDLLList.Objects[index])
else begin
//如果没找到,从硬盘装载
Result := LoadLibrary(PChar(AFileName));
FDllList.AddObject(AFileName, Pointer(Result));
end;
end;
//释放:
procedure TFmMain.UnloadAllDll;
var
i: integer;
HM: THandle;
begin
//释放所有加载的Dll,释放FDllList变量
if Assigned(FDllList) then
begin
for i := FDllList.Count - 1 downto 0 do
begin
HM := THandle(FDLLList.Objects);
if HM > 0 then
FreeLibrary(HM); //Delphi2006在这里报错,Delphi2006死掉。
end;
FDllList.Free;
end;
end;

上面的代码在D7里不报错,但是在D2006里报错,不知道为什么。
 
大家好,我也为这个问题困扰了很长时间了,希望大家贴点好的方法出来。
QQ:39745001 Eamil:wlls790708@163.com
 
不带包编译解决上面问题。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部