最近发现了VS(VS2008,VS2010,VS2012,VS2013)的一个大Bug,就是在新建ATL项目时,如果直接选择Service,则服务无将法正确调用。其表现为:
在客户端调用CoCreateInstance或CreateObject会返回:
Error: 429 Description: ActiveX 部件不能创建对象
在服务端会返回(CLSID会根据实际情况发生变化):
The server {7A387102-53AE-4A3A-8F28-5EE76C2BC1E4} did not register with DCOM within the required timeout. 服务器 {7A387102-53AE-4A3A-8F28-5EE76C2BC1E4} 没有在限定的时间内用 DCOM 注册。
经过多方排查,最后发现,是在rgs文件中少了一行
val AppID = s '%APPID%'
调整后的rgs文件如下:
HKCR { ATLService.JustATestSvc.1 = s 'JustATestSvc Class' { CLSID = s '{7A387102-53AE-4A3A-8F28-5EE76C2BC1E4}' } ATLService.JustATestSvc = s 'JustATestSvc Class' { CurVer = s 'ATLService.JustATestSvc.1' } NoRemove CLSID { ForceRemove {7A387102-53AE-4A3A-8F28-5EE76C2BC1E4} = s 'JustATestSvc Class' { ProgID = s 'ATLService.JustATestSvc.1' VersionIndependentProgID = s 'ATLService.JustATestSvc' ForceRemove Programmable LocalServer32 = s '%MODULE%' { val ServerExecutable = s '%MODULE_RAW%' } val AppID = s '%APPID%' TypeLib = s '{9D5B6B0C-85D6-4DB6-B88A-915180B89038}' Version = s '1.0' } } }
重新编译后,就可以调用成功了。
好坑啊!