Delphi2007编译服务引发WIN+E快捷键失效等一系列问题
这里啰嗦了几点,文字比较多,只是想尽力把问题描述清楚,以备后用。临时码的子,没有校对,有不清楚的地方请提出。
一、问题的发现:
自己做的程序,突然接收不到WM_DEVICECHANGE消息,很是纳闷……最近都没有新安装软件,左思右想,前两天自己写了个svchost.exe调用的服务。索性将服务停止,程序能正常接受WM_DEVICECHANGE消息了。
庆幸的是自己写了的这么一个服务,要不然,还不知道什么时候才能发现问题所在-_-!!!
【注1】 关于消息问题在这里有记载:获取USB设备插拔消息的备忘
【注2】 还导致WIN+E等快捷键失效,按了WIN+E之后,任务栏停止响应,必须停止服务后,系统才响应WIN+E打开资源管理器
二、找出元凶
因为新鲜,以前也玩过svchost.exe调用的服务,但是也没有发现类似的问题。不知哪来的灵光一闪,用Delphi7.0编译,测试一切正常。
再次用Delphi2007编译,问题依旧。
三、罪魁祸首
发现这个问题有好些天,在心里一直放不下,陆陆续续几乎每天都要调试一下。
首先是怀疑自己新添加的代码有问题,将代码一行一行注释、删除,问题依旧存在。
无奈,只有将uses的单元一个一个去除,最终发现,问题出在Controls单元,如果将uses的Controls单元取消,系统一切正常。
四、结论
使用Delphi2007编译,而且引用了Controls单元,将引发WIN+E快捷键失效等一系列问
五、进一步研究
经过哈欠点拨:“你用工具查看一下它载入的DLL们....同D7比较一下”。果然,Delphi2007编译出的dll多载入了两项进程。
(c:\windows\system32\msctfime.ime、c:\windows\system32\apphelp.dll)
查看步骤:
1、启动服务
2、到DOS提示符状态,运行tasklist.exe /svc,查看服务名称为ServiceDll的进程ID
3、运行工具查看该进程载入的dll(我这里用的是老妖的Spy4Win->附加工具->进程管理)
六、服务程序说明
该服务框架从网上下载,考虑到方便安装和卸载,加入了DllRegisterServer,DllUnregisterServer两个函数,
安装服务:regsvr32.exe ServiceDll.dll
卸载服务:regsvr32.exe ServiceDll.dll
【注3】安装之后,应手动运行服务;卸载之前,应手动停止服务。
七、源程序
因为上传附件失败,这里直接贴出源程序。
[解决办法]
试一下把所有wincontrol继承下来的类的实例的ImeMode都置为imDisable.
[解决办法]
高科技啊,,,
[解决办法]
ADVAPI32.dll Advanced Windows 32 Base API Microsoft Corporation 5.02.3790.3959comctl32.dll Common Controls Library Microsoft Corporation 5.82.3790.3959ctype.nls GDI32.dll GDI Client DLL Microsoft Corporation 5.02.3790.4237IMM32.DLL Windows IMM32 API Client DLL Microsoft Corporation 5.02.3790.3959kernel32.dll Windows NT BASE API Client DLL Microsoft Corporation 5.02.3790.4062locale.nls LPK.DLL Language Pack Microsoft Corporation 5.02.3790.3959msvcrt.dll Windows NT CRT DLL Microsoft Corporation 7.00.3790.3959ntdll.dll NT Layer DLL Microsoft Corporation 5.02.3790.3959ole32.dll Microsoft OLE for Windows Microsoft Corporation 5.02.3790.3959oleaut32.dll Microsoft Corporation 5.02.3790.4202RPCRT4.dll Remote Procedure Call Runtime Microsoft Corporation 5.02.3790.4115Secur32.dll Security Support Provider Interface Microsoft Corporation 5.02.3790.3959servicedll.dll sortkey.nls sorttbls.nls svchost.exe Generic Host Process for Win32 Services Microsoft Corporation 5.02.3790.3959unicode.nls USER32.dll Windows USER API Client DLL Microsoft Corporation 5.02.3790.4033USP10.dll Uniscribe Unicode script processor Microsoft Corporation 1.422.3790.3959version.dll Version Checking and File Installation Libraries Microsoft Corporation 5.02.3790.3959
[解决办法]
主机名: ***OS 名称: Microsoft(R) Windows(R) Server 2003, Enterprise EditionOS 版本: 5.2.3790 Service Pack 2 Build 3790OS 制造商: Microsoft CorporationOS 配置: 独立服务器OS 构件类型: Multiprocessor Free注册的所有人: ***注册的组织: ***产品 ID: 69713-640-4203633-45978初始安装日期: 2008-8-17, 22:01:04系统启动时间: 0 天 0 小时 34 分 31 秒系统制造商: Dell Inc.系统型号: Latitude D630 系统类型: X86-based PC处理器: 安装了 2 个处理器。 [01]: x86 Family 6 Model 15 Stepping 13 GenuineIntel ~1994 Mhz [02]: x86 Family 6 Model 15 Stepping 13 GenuineIntel ~1994 MhzBIOS 版本: DELL - 27d8071cWindows 目录: C:\WINDOWS系统目录: C:\WINDOWS\system32启动设备: \Device\HarddiskVolume1系统区域设置: zh-cn;中文(中国)输入法区域设置: zh-cn;中文(中国)时区: (GMT+08:00) 北京,重庆,香港特别行政区,乌鲁木齐物理内存总量: 2,038 MB可用的物理内存: 1,122 MB页面文件: 最大值: 1,891 MB页面文件: 可用: 1,168 MB页面文件: 使用中: 723 MB页面文件位置: 暂缺域: WORKGROUP登录服务器: ***修补程序: 安装了 118 个修补程序。网卡: 安装了 4 个 NIC。
[解决办法]
嗯,的确很罗嗦,来围观一下。
[解决办法]
那就是大傻rp问题了。
[解决办法]
Mark一下。
[解决办法]
如果你的服务里的工作跟当前桌面没有关系的话,可以试着将其切换到其它桌面,maybe可以解决这个冲突的问题
[解决办法]
P.S. 当初这个代码是用来作坏事的,没有想到,居然还能有人拿来作好事,咔咔.
[解决办法]
很深,很难懂
[解决办法]
看熱鬧!
[解决办法]
下班了,mark一下吧.
[解决办法]
留个记号
[解决办法]
hoho~~~~~~~
[解决办法]
我好笨啊,都看不懂,先回复一下好了,慢慢学习
PS:
我的目标是 ---->
^_^
[解决办法]
好多星星。。。。。
[解决办法]
看热闹,顺便学习下》》》》》》》》》》》
[解决办法]
太强悍
[解决办法]
好。。。。。。。。。。。。
[解决办法]
因为新鲜,以前也玩过svchost.exe调用的服务
这是作什么的?
[解决办法]
搬个板凳听讲。