500个大元!!!如何解决这个问题!!!(50分)

  • 主题发起人 主题发起人 jingtao
  • 开始时间 开始时间
J

jingtao

Unregistered / Unconfirmed
GUEST, unregistred user!
先给50分,回答正确的给500分!
有一个程序,开了它经常关不了机,重启和注销也不行.屏幕闪了一下又回来了.
在程序中已有拦截关机信息代码(代码绝对正确).但经常发生程序无法收到关
机信息的问题在多台机上试了都是有时侯可以关而已。
程序为非线程程序。
如何解决?
 
终止进程!TerminateProcess
 
有没有用过FastNet方面的控件?
 
z_cd>>CAN'T
教父>>YES!!!而且我必须要用它.Help!!!!(搞一个像OICQ的工具)
 
不行,nm的控件就有这毛病,从delphi3到delphi5都没改
TNMxxx控件都如此。
高手都用其他socket控件,比如ics
下载:http://www.rtfm.be/fpiette/indexuk.htm
 
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大侠:
谢谢您。您一定要帮忙才行啊。我已经把nm控件的源码搞定了。
http://lovejingtao_2000.home.chinaren.com/Fastnetd5.zip(注意大小写)
搞定后发到Lovejingtao@21cn.com给我好吗?我给你800分,不够可以再加的。
提了X个问题都没有答案了。。。。。。。。。。
 
在 PSock.pas
在 TThreadTimer.Wndproc 内
Result := DefWindowProc( 0, Msg, WPARAM, LPARAM );
改为:
Result := DefWindowProc( FWindowHandle, Msg, WPARAM, LPARAM );
 
Pipi大侠:您好!
我试了一下,新的FASTNET的控件都没有这个问题了,但它代码没有变啊。
为什么呢?
 
delphi5 update 1 和 bcb5 update 1 带来的nm控件都还有这毛病,
你是从他的主页找到的新控件吗?
如果新的FASTNET的控件没有这个问题了,而代码没有改变,有2个可能
1、原来nm控件是不管有没有用到timer都创建那个隐藏窗口,新控件可能是改变了
这个做法,要用的时候才建,用完就删他。如果是这样,这只是隐藏了问题,而不是
解决了问题。 DefWindowProc( 0... ) 这个调用是很低级的错误,隐患仍然存在。
2、可能你下载的源码不是你最新控件的源码,而是旧一点的。
 
想强行退出Delphi的程序的话, 可以用halt(0)函数.
 
Pipi.>>请您进来拿分啊。我分了几次给才搞定:)
 
主要是只有到了晚上才能上网(自费)
 
多人接受答案了。
 

Similar threads

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