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

Jac*_*ith 7 c++ com registry atl visual-studio-2010

我正在创建一个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'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这为CLSID正确创建了注册表项.但是,当尝试从外部调用CoCreateInstance时,我遇到了挂起.

hr = CoCreateInstance( __uuidof(Test), NULL, CLSCTX_ALL, __uuidof(ITest), (void**)&pTest);
Run Code Online (Sandbox Code Playgroud)

在看了一些其他项目的例子之后,我注意到他们都有类型的注册表项:

HKEY_CLASSES_ROOT\<MODULE>.<CLASS>
HKEY_CLASSES_ROOT\<MODULE>.<CLASS>\CLSID
Run Code Online (Sandbox Code Playgroud)

我调查了这些类的.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'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我的CoCreateInstance调用不再挂起,我能够正确检索指向ITest接口的指针.

现在,我的问题是,考虑到上述细节,我如何确保我创建的任何未来类都具有正确的.rgs文件格式?在创建类对象时是否有一些我缺少的选项?或者我是否需要为我创建的每个类手动添加上述内容?

我正在使用Visual Studio 2010.

Han*_*ant 6

那是coclass的ProgID.它主要由脚本语言使用,即使用后期绑定的语言. CreateObject()是通常的函数名.这与挂起有关是无法解释的,你最好调试一下.

否则.rgs条目由ATL向导自动生成.ProgID编辑框是右下角的编辑框.它不会像其他人一样自动填充,你可能会错过它.