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