Получение CLSID для DLL файла?

Я хочу создать небольшое приложение для добавления и удаления пользовательских записей контекстного меню из реестра. Чтобы это сделать, мне нужно получить CLSID произвольной DLL, чтобы я мог создавать резервные копии предыдущих записей, если они существуют до написания новых.

Хотя regsrv32 каким-то образом удается создать это магическое число, я не нашел способа получить этот номер самостоятельно.

Я надеюсь, что есть что-то лучше этого:

  • реестра сканирования для имени DLL
  • если не найден, зарегистрируйте его, снова сканируйте, а затем отмените регистрацию еще раз

Если DLL была переименована, я вижу возможность возникновения проблем.

Ответ 1

Вы можете рассмотреть возможность вызова LoadTypeLibEx в DLL с указанием REGKIND_NONE, а затем изучить TypeLibInfo, доступный через Интерфейс ITypeLib, переданный вам.

Там есть информация об этом на MSDN. Это старая ссылка, ориентированная на VB6, но имеющая полезную информацию об инспекции COM-компонентов таким образом.

Ответ 2

Вы можете попытаться использовать RegOverridePredefKey(), чтобы перехватить то, что regsvr32 делает в реестре, - вызвать RegOverridePredefKey(), а затем воспроизвести, что делает regsvr32 - LoadLibrary() COM-сервер, вызовите DllRegisterServer() - затем проверьте сделанные изменения. С помощью RegOverridePredefKey() вы будете изолировать изменения и не позволять им становиться постоянными.