有关数据报协议UDP的奇怪的急死我了的问题,求大家帮忙,解决马上给分。(100分)

  • 主题发起人 主题发起人 zcm1975117
  • 开始时间 开始时间
Z

zcm1975117

Unregistered / Unconfirmed
GUEST, unregistred user!
我新建立了一个程序,在上面放了一个TNMUDP控件,然后运行编译后的程序。在不关闭的
情况关机,居然关不了机,不知是什么原因,怎么解决呢?大家可以试一试吧。(因为我的
程序是在后台运行,所以用户是不能手工关闭的)。
 
N多的人问过这个问题了,FastNet的那一套东西都有这个问题,除了换控件外,别无他法,
推荐ICS或是INDY。
 
那里可以下载呀??
 
to 教父:delphi6自带的,是不是?那是不是服务端和客户端不同呀?不象TNMUDP控件都是
一样。
 
to 教父:怎么读出客户端发送来内容呀??
 
写普通应用程序TNMUDP不会有这个问题呀,我用它开发过项目,很好用。
但你在程序退出时要释放它才行。
如果写服务程序会有这个问题。
 
只要处理以下windows在关机的时候发送给每个应用程序的关机消息(好像是exit_query)
,然后在使用udp的程序中处理并返回windows一个可以关机的消息,这样就可以了。
 
读数据是在OnDataReceived事件中用NMUdp.Read();

TNMxxx控件不能退出windows的原因是:
所有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处理都是无效的。

一个可能的解决的办法是修改lib或者dcu,使
跳过调用DefWindowProc,全部返回1。
bcb中改 nmfast50.lib(debug和release都有)
delphi中改 psock.dcu
查找 8b 43 08 50 8b 43 04
修改为 b8 01 00 00 00 eb 09
注意仅供测试,这个修改使其可以退出windows
但不能保证不出其他问题。
如果在正式程序中使用出问题,责任自负。
建议还是用其他控件,比如ics

由于没有nm控件的源码,所以没办法根治。
(以上说法来自PiPi.,呵呵)
 
问题解决!还是使用INDY控件组。谢谢大家!!
 
接受答案了.
 
后退
顶部