Регистрация класса COM ATL. Значения по умолчанию для файла .rgs - PullRequest
7 голосов
/ 20 апреля 2011

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

6 голосов
/ 20 апреля 2011

Это ProgID для Coclass.Он в основном используется языками сценариев, которые используют позднюю привязку. CreateObject () - это обычное имя функции.То, что это как-то связано с зависанием, необъяснимо, лучше отладить его.

В противном случае запись .rgs автоматически генерируется мастером ATL.Поле редактирования ProgID находится в правом нижнем углу.Он не заполняется автоматически, как остальные, вы, вероятно, пропустили его.

1 голос
/ 09 октября 2016

Извините, что пришёл пять лет спустя ... Я получил аналогичную проблему с мастером ATL COM с помощью Visual Studio 2015 Pro. (ошибка 0x80080005 - сбой при выполнении сервера) Это похоже на ошибку в мастере COM 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/

Обычно мастеру не удается добавить запись реестра AppID в соответствующий файл rgs:

NoRemove CLSID
{
    ForceRemove {...} = s '...'
    {
        ...
        val AppID = s '%APPID%'
    }
}

Файлы .rgs не полностью заполняются мастером. Надеюсь, это поможет.

...