2016-01-15 3 views
1

Когда я зарегистрировать DLL COM, запустив regsvr32 MyCOMdll.dll в CMD я вижу несколько записей, созданных в реестре, один из них:Где Clsid происходит от при регистрации COM

[HKEY_CLASSES_ROOT\MyCOMdll.MyClass\Clsid] 
@="{DB402D5A-5584-4F68-A750-45D3E8133121}" 

Я хотел бы понять, где происходит от DB402D5A-5584-4F68-A750-45D3E8133121 , изначально я думал, что GUID сгенерирован в момент регистрации этой DLL, однако я проверил это в разных средах, и я вижу, что он имеет такое же значение. Похоже, что эти GUID встроены в DLL, но я не могу подтвердить или узнать, в какой точке.

Контекст: Я хочу выполнить «горячую замену» этого COM, однако это не кажется простым. Я пытался обновлять GUID в реестре после регистрации новой DLL, но получаю ошибку ClassFactory cannot supply requested class.

+0

Это ваш код, который записывает эти ключи. Однако вы внедрили функцию DllRegisterServer(). Как правило, скрывается полезная библиотека классов. Если это, скажем, ATL, то это происходит из автоматически сгенерированного файла .rgs, созданного мастером класса. Все возможно, не говоря о том, что вы использовали, не позволяет точно ответить. –

ответ

2

Когда вы регистрируете COM-библиотеку с использованием regsvr32, CLSID определяются внутри dll.

В типичном проекте ATL COM эти записи указаны в файлах * .rgs и registry is updated based on that content. Конечно, это не единственный способ сделать это, а другие инструменты и технологии делают это по-разному.

Эти CLSID фактически определены в .idl-файле проекта (опять же, это действительно для проектов ATL), а файл .rgs должен правильно соответствовать значениям. Сам файл .idl содержит IDL определения всех типов COM в библиотеке и используется компилятором MIDL для генерации библиотеки типов.