¿Cómo sé si una DLL está registrada?

28

Cuando registra un archivo DLL en máquinas antiguas (Windows XP), regsrv siempre dice que el registro se realizó correctamente. Esto sucede incluso si el usuario no tiene permiso para registrarse.

Con el nombre de la dll, ¿hay algún comando que pueda ejecutar en la línea de comando para verificar si hay una DLL instalada?

neves
fuente

Respuestas:

22

He encontrado este enlace: ¿Cómo puedo saber si se ha registrado una DLL? :

Dado que el registro de DLL puede abarcar operaciones arbitrarias, no existe una forma de propósito general de determinar si se ha realizado el registro de una DLL arbitraria.

Para determinar si se ha registrado un archivo DLL, debe aportar conocimientos específicos del dominio. Si sabe que una DLL registra un objeto COM con un CLSID en particular, puede verificar si ese CLSID está realmente registrado.

OK, es imposible, pero las DLL generalmente se registran creando una entrada en el registro. Una solución alternativa es:

  1. Primero tiene que descubrir el GUID COM de la DLL. Si tiene una máquina donde ya está registrada, puede:
    1. Abra regedit y busque su nombre de archivo DLL
    2. Si está registrado, encontrará el nombre del archivo debajo de una clave que está debajo de TypeLib. La clave se verá así: {9F3DBFEE-FD77-4774-868B-65F75E7DB7C2}
  2. Ahora que conoce el GUID de DLL, puede buscarlo con este comando en un indicador de DOS: reg query HKCR\CLSID | find /i "{9F3DBFEE-FD77-4774-868B-65F75E7DB7C3}"

Una mejor respuesta me permitiría encontrar el GUID directamente desde el archivo antes de que se registrara. Al menos de esta manera, puede crear un script para instalar y verificar si se instaló correctamente.

neves
fuente
44
En realidad, no necesita conocer el GUID de antemano. Un enfoque más simple sería buscar en el Registro el nombre del archivo DLL : si ese nombre aparece en cualquiera de esas claves GUID, entonces sí, la DLL ha sido registrada.
Massimo
@ Massimo: ¿pero cómo lo buscaría? En que clave Puede mostrarse erróneamente en el historial del shell (por ejemplo, intentó registrarse sin ser administrador)
neves
Bajo HKCR, obviamente :) O al menos bajo HKLM. Las cosas específicas del usuario (como el historial de shell) están bajo HKCU.
Massimo
@ Massimo: si pone una respuesta aquí con el comando de shell para buscarla, la marcaré como la respuesta correcta.
neves
Es igual que el suyo: use REG QUERYpara buscar el nombre del archivo DLL.
Massimo
13

Necesitaba verificar si una DLL con un nombre en particular está registrada y usé este comando en mi BAT:

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

Si con errorlevel envió control a la etiqueta cuando nunca reg queryencontró nada. Es posible que deba cambiar la parte del registro donde realiza la búsqueda (en mi caso HKLM'..., cuanto más específica sea la ruta, más rápido, de lo contrario, llevará mucho tiempo).

La salida se puede procesar si es necesario, se puede obtener el GUID para la entrada, pero eso está fuera del alcance del comando de consulta de registro.

virgo47
fuente
0

Para encontrar entradas de registro (y opcionalmente objetos COM) para una DLL desde la línea de comandos , una combinación de las respuestas de @ virgo47 y @neves funcionó mejor para mí.

  1. Encuentre entradas de registro que contengan el nombre de la DLL. Estas entradas suelen utilizar GUID como sus claves.

    consulta de registro HKLM \ SOFTWARE \ Clases / s / f whatever.dll

  2. (opcional) Encuentra objetos COM que se han registrado para estos GUID. (El uso /s /f "{GUID}"debería ser más rápido que | findstr /i "{GUID}". Y | find /i "{GUID}"parece ser un error tipográfico (pero todavía no puedo escribir comentarios sobre Serverfault)).

    consulta de registro HKCR \ CLSID / s / f "{9F3DBFEE-FD77-4774-868B-65F75E7DB7C3}"

Orafu
fuente