首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ATL COM类注册.rgs文件默认值

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

Stack Overflow用户
提问于 2011-04-20 12:15:47
回答 2查看 9.6K关注 0票数 8

我正在创建一个COM服务器可执行文件,并且遇到了一个类注册问题。当我创建类对象时,自动生成的.rgs文件如下所示:

代码语言:javascript
复制
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时,我遇到了挂起问题。

代码语言:javascript
复制
hr = CoCreateInstance( __uuidof(Test), NULL, CLSCTX_ALL, __uuidof(ITest), (void**)&pTest);

在查看了其他几个项目的示例后,我注意到它们都具有以下类型的注册表项:

代码语言:javascript
复制
HKEY_CLASSES_ROOT\<MODULE>.<CLASS>
HKEY_CLASSES_ROOT\<MODULE>.<CLASS>\CLSID

我研究了这些类的.rgs文件,注意到我的.rgs文件中没有这些类的额外条目。我将它们添加到我的列表中,并将其更改为:

代码语言:javascript
复制
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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-20 12:51:23

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

否则,.rgs项将由ATL向导自动生成。ProgID编辑框位于右下角。它不会像其他的那样自动填充,你可能错过了它。

票数 7
EN

Stack Overflow用户

发布于 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注册表项:

代码语言:javascript
复制
NoRemove CLSID
{
    ForceRemove {...} = s '...'
    {
        ...
        val AppID = s '%APPID%'
    }
}

向导未完全填充.rgs文件。希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5725424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档