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

我正在创建一个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编辑框是右下角的编辑框.它不会像其他人一样自动填充,你可能会错过它.

相关文章

对象的传值与返回说起函数,就不免要谈谈函数的参数和返回值...
从实现装饰者模式中思考C++指针和引用的选择最近在看...
关于vtordisp知多少?我相信不少人看到这篇文章,多半是来自...
那些陌生的C++关键字学过程序语言的人相信对关键字并...
命令行下的树形打印最近在处理代码分析问题时,需要将代码的...
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特...