为什么使用了TNMUDP的程序驻留在内存,就不能正常退出WINDOWS???(200分)

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

hyb

Unregistered / Unconfirmed
GUEST, unregistred user!
正编制一个局域网的聊天、通讯、文件传输、语音对话等功能的小程序,使用了标准控件
TNMUDP,后发现程序驻留在内存时就不能关闭WINDOWS,多次排查才发现是它惹的祸,非常
不解,也没有找到替代的控件,请各位大侠指点一二,不胜感激!(200大洋奉上)
 
是否正常结束程序,释放资源?
 
我做了个例子,哪怕只在FORM中放一个TNMDUP的控件,不写任何代码,这样的程序运行
后也不能关闭WINDOWS!我分别在WIN98和WIN ME环境下DELPHI5.0和DELPHI6.0中均试过
了多次!
与程序其他资源释放无关,但与TNMDUP本身资源释放是否有关就不知道了,也没有查找
到相关例子!
 
正常
这个问题我也碰到过,花了无数的精力才找出原因
建议不要用TNMxxx,破得厉害
用ICS或者INDY吧
 
有道理,我前几天用tnumhttp写一个网络蜘蛛,在线程中free后sock却关不了,最后还是
用indy,虽然tnumhttp用timeout,inty却没有
 
我花了两天时间查原因,被迫备份所有本来扫尾收工的源程序后再一个一个删才发现!
不过在DELPHI6中发现两个分成一个Client和一个Server的类似DUP的东东,试用后没有上
述问题!只是想请教几位大侠的是:它们都有一个是否广播的属性,如何使用?
 
-----------------------------------------------------------------------
实际应用之三:利用流制作自己的OICQ

OICQ是深圳腾讯公司的一个网络实时通讯软件,在国内拥有大量的用户群。
但OICQ必须连接上互联网登陆到腾讯的服务器才能使用。所以我们可以自己写
一个在局部网里面使用。
OICQ使用的是UDP协议,这是一种无连接协议,即通信双方不用建立连接就
可以发送信息,所以效率比较高。Delphi本身自带的FastNEt公司的NMUDP控件
就是一个UDP协议的用户数据报控件。
不过要注意的是如果你使用了这个控件必须退出程序才能关闭计算机,因为
TNMXXX控件有BUG。所有nm控件的基础 PowerSocket用到的ThreadTimer,用到
一个隐藏的窗口(类为TmrWindowClass)处理有硬伤。
出问题的地方:
Psock::TThreadTimer::WndProc(var msg:TMessage)
if msg.message=WM_TIMER then
他自己处理
msg.result:=0
else
msg.result:=DefWindowProc(0,....)
end
问题就出在调用 DefWindowProc时,传输的HWND参数居然是常数0,这样实际
上DefWindowProc是不能工作的,对任何输入的消息的调用均返回0,包括
WM_QUERYENDSESSION,所以不能退出windows。由于DefWindowProc的不正常调用,
实际上除WM_TIMER,其他消息由DefWindowProc处理都是无效的。
解决的办法是在 PSock.pas
在 TThreadTimer.Wndproc 内
Result := DefWindowProc( 0, Msg, WPARAM, LPARAM );
改为:
Result := DefWindowProc( FWindowHandle, Msg, WPARAM, LPARAM );
早期低版本的OICQ也有这个问题,如果不关闭OICQ的话,关闭计算机时屏幕闪
了一下又返回了。
------------------------------------------------------------------------
可以用ICS代替的,不过我建议直接用SOCKET,效率也很高
 
TNMxxx没有源码,这个源码是哪弄来的?
 
我有完整的代码,而且版本比DELPHI本身带的高。要的话等到17日放假回家后给你。
 
可以的话也给我一份,谢谢!
llwu@263.net
 
谢谢jingtao,看得出你曾对通信程序有不少研究,居然连TNMxxxx的源码都搜到了!
从你所述看似乎是从你的某篇论述中截取的一部分,能否将整篇赠阅,不胜感激!
hyb@netease.com,即将200大洋奉上!!!
 
我编的『网聊NetChat』也是用了TNMUDP控件,也发现了这个BUG,后来找到了解决方法,就是在
OnCloseQuery事件中加入halt;
欢迎光临『风之纹章』http://ph11.126.com
『网聊NetChat』主要功能:
1.批量传送文件功能(理论上文件大小不受限制)
2.查找/显示在线好友功能
3.自动回复功能
4.支持联众聊天命令格式,提供近六百条聊天语句且可自行增删修改(Cool)
5.支持多IP设置,可以在不同网段间聊天
6.提供信息包和IP地址过滤功能
7.用户账号密码设置,传送信息加密,聊天记录加密功能
8.自动隐藏功能
9.收到信息多种提醒功能,包括:声觉、视觉(颜色、动画)
10.聊天室
11.支持多用户设置
12.皮肤更换、设置
新版(未发布已实现功能):
◇新增好友头像,可选择不同的显示模式(大/小图标)COOL
◇好友分组管理,可自行增、删、改组,组别切换声音提示
◇添加自动添加好友功能,只要有人在线就自动全部添加到好友名单中去,不用你动一根手指Cool
◇上下线自动发送信息功能(旧版本不会收到)


 
to 左轻侯:我忘记了,老冯也有那个东西,叫Free.exe。

to llwu:好的,不过我现在都只能在网吧上网,所以一定要到放假回家才可以。
武汉实在太热了,只能到网吧吹空调:)

to hyb:我也没有什么研究的啊,是以前从别人那里学来的。
那段东西在《谈Delphi编程中“流”的利用》,共分《利用流制作EXE文件加密器、捆绑、自解压文件及安装程序》、
《自制电子贺卡生成器》、《自制简单OICQ》和《INTENET网络屏幕传输》等几个例子,里面包括了所有的函数。
如无意外的话7.10的《电脑商情报》将会连载的。我的信箱有备份,只有等他们登了我才能发。

to wind2000:好像不行的吧。我试过捕足WINDOWS的关机消息,但十次只有几次可以的,而且
成功的机会没有规律。后来HALT程序, 但不够完美:每次都要关两次电脑。

另外,有一个叫UDPSOCK的控件,效率奇高!ICS我试过在INTENET上传输语音,居然完全
掉失!最好成绩是传了三个字而已。用UDPSOCK, 完全解决问题。

对于这个问题,我认为我只能回答到这里了。


 
to jingtao:果然水平非凡!谢谢指点,如有机会,一定拜读您的大作!!!
 
OK,登了之后把电子版贴上来吧
 
在同学家上传了:)
http://go4.163.com/lovejingtao/fastnet.zip
 
这个问题我不了解,呵呵
 
已经更新了http://go4.163.com/lovejingtao
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部