Значения по умолчанию для файла .rgs регистрации класса ATL COM

Я создаю исполняемый файл 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.

7
задан Jack Smith 20 April 2011 в 04:15
поделиться