最近发现了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'
}
}
}
重新编译后,就可以调用成功了。
好坑啊!