ATL NT Service 调用超时

最近发现了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'
		}
	}
}

重新编译后,就可以调用成功了。

好坑啊!

Leave a Reply

Your email address will not be published. Required fields are marked *

*