ATL COM类注册.rgs文件默认值

时间:2011-04-20 04:15:47

标签: c++ visual-studio-2010 com registry atl

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

2 个答案:

答案 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文件。 希望这会有所帮助。