Delphi2007编译服务引发WIN+E快捷键失效等一系列有关问题

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.
------解决方案--------------------
高科技啊,,,
------解决方案--------------------
探讨


但是用Delphi2007创建的非svchost调用的服务没有问题。

------解决方案--------------------
可能出问题的大概是三个方向:
1. IME(输入法),这个在D6/D7都有,应该可能性最小;
2. Desktop Window Manager(DWMAPI.dll)这个只有VISTA以上系统才有,所以也不可能会是问题;
3. Theme,这个出现问题的可能性最大。建议试着[关闭]/[打开]windows的Theme服务,试一下会不会有所改善。
------解决方案--------------------
高科技啊,,,
------解决方案--------------------
我直接使用Delphi 2007编译的,并不会加载那两个文件。
------解决方案--------------------
我这里还是不会加载,我这里只加载下面这几个模块:
BatchFile code
ADVAPI32.dll    Advanced Windows 32 Base API    Microsoft Corporation    5.02.3790.3959
comctl32.dll    Common Controls Library    Microsoft Corporation    5.82.3790.3959
ctype.nls            
GDI32.dll    GDI Client DLL    Microsoft Corporation    5.02.3790.4237
IMM32.DLL    Windows IMM32 API Client DLL    Microsoft Corporation    5.02.3790.3959
kernel32.dll    Windows NT BASE API Client DLL    Microsoft Corporation    5.02.3790.4062
locale.nls            
LPK.DLL    Language Pack    Microsoft Corporation    5.02.3790.3959
msvcrt.dll    Windows NT CRT DLL    Microsoft Corporation    7.00.3790.3959
ntdll.dll    NT Layer DLL    Microsoft Corporation    5.02.3790.3959
ole32.dll    Microsoft OLE for Windows    Microsoft Corporation    5.02.3790.3959
oleaut32.dll        Microsoft Corporation    5.02.3790.4202
RPCRT4.dll    Remote Procedure Call Runtime    Microsoft Corporation    5.02.3790.4115
Secur32.dll    Security Support Provider Interface    Microsoft Corporation    5.02.3790.3959
servicedll.dll            
sortkey.nls            
sorttbls.nls            
svchost.exe    Generic Host Process for Win32 Services    Microsoft Corporation    5.02.3790.3959
unicode.nls            
USER32.dll    Windows USER API Client DLL    Microsoft Corporation    5.02.3790.4033
USP10.dll    Uniscribe Unicode script processor    Microsoft Corporation    1.422.3790.3959
version.dll    Version Checking and File Installation Libraries    Microsoft Corporation    5.02.3790.3959