我正在创建一个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。
发布于 2011-04-20 12:51:23
这是coclass的ProgID。它主要由使用后期绑定的脚本语言使用。CreateObject()是常用的函数名。这与挂起有什么关系是无法解释的,你最好对它进行调试。
否则,.rgs项将由ATL向导自动生成。ProgID编辑框位于右下角。它不会像其他的那样自动填充,你可能错过了它。
发布于 2016-10-09 05:34:02
很抱歉五年后才来...我在使用Visual Studio 2015 pro的ATL COM向导中遇到了类似的问题。(错误0x80080005 -服务器执行失败)它看起来像是ATL向导上的错误(因为有些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文件。希望这能有所帮助。
https://stackoverflow.com/questions/5725424
复制相似问题