我正在创建一个COM服务器可执行文件,并且遇到类注册问题。当我创建我的类对象时,自动生成的.rgs文件如下所示:
HKCR
{
NoRemove CLSID
{
ForceRemove {4C6DAD45-64B4-4C55-81C6-4CE125226421} = s 'Test Class'
{
ForceRemove Programmable
LocalServer32 = s '%MODULE%'
{
val ServerExecutable = s '%MODULE_RAW%'
}
TypeLib = s '{EAA173CA-BDBC-463A-8B7A-B010EFA467BC}'
Version = s '1.0'
}
}
}
这为CLSID正确创建了注册表项。但是,当尝试从外部调用CoCreateInstance时,我遇到了挂起。
hr = CoCreateInstance( __uuidof(Test), NULL, CLSCTX_ALL, __uuidof(ITest), (void**)&pTest);
在查看其他几个项目之后,我注意到他们都有类型的注册表项:
HKEY_CLASSES_ROOT\<MODULE>.<CLASS>
HKEY_CLASSES_ROOT\<MODULE>.<CLASS>\CLSID
我调查了这些类的.rgs文件,发现他们的.rgs文件中没有额外的条目。我把它们添加到我的,改为:
HKCR
{
TestModule.Test = s 'Test Class'
{
CLSID = s '{4C6DAD45-64B4-4C55-81C6-4CE125226421}'
}
NoRemove CLSID
{
ForceRemove {4C6DAD45-64B4-4C55-81C6-4CE125226421} = s 'Test Class'
{
ForceRemove Programmable
LocalServer32 = s '%MODULE%'
{
val ServerExecutable = s '%MODULE_RAW%'
}
TypeLib = s '{EAA173CA-BDBC-463A-8B7A-B010EFA467BC}'
Version = s '1.0'
}
}
}
瞧,我的CoCreateInstance调用不再挂起,我能够正确检索指向ITest界面的指针。
现在,我的问题是,考虑到上述细节,我如何确保我创建的任何未来类都具有正确的.rgs文件格式?在创建类对象时是否有一些我缺少的选项?或者我是否需要为我创建的每个类手动添加上述内容?
我正在使用Visual Studio 2010。
答案 0 :(得分:6)
这是coclass的ProgID。它主要由脚本语言使用,即使用后期绑定的语言。 CreateObject()是通常的函数名称。这与挂起有关是无法解释的,你最好调试它。
.rgs条目由ATL向导自动生成。 ProgID编辑框是右下角的编辑框。它不会像其他人一样自动填充,你可能会错过它。
答案 1 :(得分:1)
对不起,五年后...... 我使用Visual Studio 2015 pro在ATL COM向导中遇到了类似的问题。 (错误0x80080005 - 服务器执行失败) 它看起来像ATL COM向导上的一个错误(因为一些VS版本,但在最新的VS2015上仍然没有得到纠正)。
我在此MS页面上找到了手动更正的答案: https://connect.microsoft.com/VisualStudio/feedback/details/782281/catlservicemodulet-not-registering-components
以上链接不再可用。但是,此博客中解释了该问题: https://blogs.msdn.microsoft.com/jigarme/2008/05/07/cocreateinstance-returns-0x80080005-for-visual-studio-2008-based-atl-service/
基本上,向导无法在关联的rgs文件中添加AppID注册表项:
NoRemove CLSID
{
ForceRemove {...} = s '...'
{
...
val AppID = s '%APPID%'
}
}
向导没有完全填充.rgs文件。 希望这会有所帮助。