如何解决NMUdp的这个bug?(100分)

  • 主题发起人 liuql188
  • 开始时间
L

liuql188

Unregistered / Unconfirmed
GUEST, unregistred user!
你做一个简单的测试就可以发现NMUdp的这个bug。
delphi中新建一个项目
在form中添加一个FastNet页的NMUdp,
保存后编译
退出delphi,运行刚编译好的EXE文件,
再试图退出windows操作系统,
怎么样,屏幕一闪就又恢复了,
根本不能退出。
我曾试着在Form的OnClose事件中写下NMUdp1.free,
可以正常了,但好像不稳定,偶然还出现不能退出的情况。
各位大侠可曾遇到过这个问题,是如何处理的。
以前我认为是delphi5的bug,可是到了delphi6,还是有问题。
 
up
每人遇到过吗?
 
我做了很多程序都使用的NMUDP,没有发现你说的问题!!
 
他的Psock.dcu有问题,如果你又PSock.pas文件,把它的消息处理中加一句
"其它消息“语句就可!或在Form的OnClose用"Halt(0)"
 
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 );
 
各位老兄说的都不错,可我没有PSOCK。PAS,怎么办?
那位能 给出一个例程 只要把它加入到我的程序,就不会出现这个问题?
 
http://tty.yyun.net/lovejingtao/htm/newdefault.htm这个网站上有关于这个问题的文章
你自己去看看吧!
 
我用了很多都没有遇到过
 
顶部