atlcom类注册.rgs文件默认值

ATL COM class registration .rgs file defaults

本文关键字:文件 默认值 rgs 注册 atlcom      更新时间:2023-10-16

我正在创建一个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

这是coclass的ProgID。它主要由脚本语言使用,这些语言使用后期绑定。CreateObject()是常用的函数名。这和挂起有什么关系是无法解释的,你最好调试一下。

.rgs表项由ATL向导自动生成。右下方为ProgID编辑框。它不会像其他的一样自动填充,你可能错过了它

抱歉五年后才来…我在使用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 -返回- 0 - x80080005 - -视觉工作室- 2008 -基于atl service/

基本上,向导无法在关联的rgs文件中添加AppID注册表项:

NoRemove CLSID
{
    ForceRemove {...} = s '...'
    {
        ...
        val AppID = s '%APPID%'
    }
}

.rgs文件没有完全被向导填充。