Как лучше всего определить, установлен ли COM-компонент? - PullRequest
2 голосов
/ 18 ноября 2008

У меня есть сборка взаимодействия COM, и я хотел бы проверить из приложения .NET, установлен ли на компьютере компонент, который я собираюсь создать.

Я хотел бы предоставить хорошее сообщение об ошибке, если оно не установлено.

Поместить инстанцирование в try-catch для меня не очень хорошее решение, так как я хотел бы провести различие между отсутствующей установкой и другими возможными ошибками.

Моя идея заключается в том, чтобы проверить, существует ли узел с идентификатором класса COM в реестре по пути HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ Interface . Но есть ли лучший подход?

Ответы [ 5 ]

6 голосов
/ 18 ноября 2008

Я думаю, что лучший способ, к сожалению, попытаться создать его. Проверка в реестре не гарантирует, что компонент вообще там (например, файл мог быть удален или перемещен после регистрации).

2 голосов
/ 18 ноября 2008

В дополнение к проблеме, о которой Эйвинд упоминает , при проверке реестра необходимо учитывать еще несколько моментов:

  • Возможно (не часто, но возможно) иметь (части) COM-регистрацию в HKCU \ Software \ Classes, так что вам также необходимо проверить это.
  • Существует также COM без регистрации , где вы не найдете ничего в реестре, но сможете создать экземпляр COM-объекта ...

Ничего из вышеперечисленного не распространено, но, тем не менее, полезно об этом знать.

Сценарий Эйвинда, вероятно, является чем-то, с чем вы столкнетесь чаще: кто-то удаляет ваш COM-сервер с диска без предварительной регистрации.

1 голос
/ 09 июня 2009

Type.GetTypeFromProgID("MyProgID") != null

0 голосов
/ 08 января 2009

Вы можете использовать iTripoli Просмотр библиотеки типов - бесплатно . Используя приведенное выше, откройте EXE / DLL в вопросе. Затем вы обнаружите GUID . Откройте regedit , перейдите в KEY: HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ CLSID. Поиск / поиск с использованием вышеуказанного GUID.

0 голосов
/ 18 ноября 2008

Вы также можете создать экземпляр класса com, который вы хотите проверить, в блоке try / catch, чтобы предупредить вашего пользователя в блоке catch. Тупое решение, согласен.

Проверка реестра кажется мне наиболее разумным подходом, поскольку незарегистрированный ком-компонент довольно бесполезен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...