Как узнать, зарегистрирована ли DLL?

28

Когда вы регистрируете DLL на старых машинах (Windows XP), regsrv всегда говорит, что регистрация прошла успешно. Это происходит, даже если пользователь не имеет разрешения на регистрацию.

С именем dll, есть ли команда, которую я могу запустить в командной строке, чтобы проверить, установлена ​​ли DLL?

Невиш
источник

Ответы:

22

Я нашел эту ссылку: Как я могу узнать, была ли зарегистрирована DLL? :

Учитывая, что регистрация DLL может включать в себя произвольные операции, не существует универсального способа определить, была ли регистрация для произвольной DLL.

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

ОК, это невозможно, но DLL обычно регистрируют себя, создавая запись в реестре. Обходной путь должен:

  1. Сначала вы должны обнаружить COM GUID библиотеки DLL. Если у вас есть один компьютер, на котором он уже зарегистрирован, вы можете:
    1. Откройте regedit и найдите свое имя файла DLL
    2. Если оно зарегистрировано, вы найдете имя файла под ключом, который находится под TypeLib. Ключ будет выглядеть так: {9F3DBFEE-FD77-4774-868B-65F75E7DB7C2}
  2. Теперь, когда вы знаете GUID DLL, вы можете найти его с помощью этой команды в командной строке DOS: reg query HKCR\CLSID | find /i "{9F3DBFEE-FD77-4774-868B-65F75E7DB7C3}"

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

Невиш
источник
4
Вам на самом деле не нужно знать GUID заранее. Более простой подход заключается в поиске в реестре имени файла DLL : если это имя указано в любом из этих ключей GUID, то да, библиотека DLL действительно зарегистрирована.
Massimo
@Massimo: но как я буду искать его? В каком ключе? Он может ошибочно отображаться в истории оболочки (например, пытался зарегистрироваться, не будучи администратором)
neves
Под HKCR, очевидно :) Или, по крайней мере, под HKLM. Пользовательские вещи (например, история оболочки) находятся под HKCU.
Massimo
@Massimo: если вы поставите здесь ответ с помощью команды shell для его поиска, я отмечу его как правильный ответ.
NEVES
Это то же самое, что и у вас: используйте REG QUERYдля поиска имени файла DLL.
Массимо
13

Мне нужно было проверить, зарегистрирована ли DLL с конкретным именем, и я использовал эту команду в моей BAT:

reg query HKLM\SOFTWARE\Classes /s /f whatever.dll
if errorlevel 1 goto DLL_MISSING

Если с errorlevel отправил управление метке, когда reg queryничего не нашел. Возможно, вам придется изменить часть реестра, в которой вы ведете поиск (в моем случае HKLM'..., чем более конкретный путь, тем быстрее, в противном случае это займет очень много времени).

Вывод может быть обработан при необходимости, GUID для записи может быть получен, но это выходит за рамки команды reg query.

virgo47
источник
0

Чтобы найти записи реестра (и, возможно, COM-объекты) для DLL из командной строки , комбинация ответов @ virgo47 и @neves лучше всего подошла для меня.

  1. Найдите записи реестра, содержащие имя DLL. Эти записи обычно используют GUID в качестве своих ключей.

    reg запрос HKLM \ SOFTWARE \ Classes / s / f what.dll

  2. (необязательно) Найдите COM-объекты, которые были зарегистрированы для этих GUID. (Использование /s /f "{GUID}"должно быть быстрее, чем | findstr /i "{GUID}". И, | find /i "{GUID}"похоже, это опечатка (но я пока не могу писать комментарии о Serverfault).)

    запрос reg HKCR \ CLSID / s / f "{9F3DBFEE-FD77-4774-868B-65F75E7DB7C3}"

Orafu
источник