Como sei se uma DLL está registrada?

28

Quando você está registrando uma DLL em máquinas antigas (Windows XP), o regsrv sempre diz que o registro foi bem-sucedido. Isso acontece mesmo que o usuário não tenha permissão para se registrar.

Com o nome da dll, existe um comando que eu possa executar na linha de comando para verificar se uma DLL está instalada?

Neves
fonte

Respostas:

22

Encontrei este link: Como posso saber se uma DLL foi registrada? :

Como o registro da DLL pode abranger operações arbitrárias, não há uma maneira geral de determinar se o registro ocorreu para uma DLL arbitrária.

Para determinar se uma DLL foi registrada, é necessário trazer conhecimento específico do domínio. Se você souber que uma DLL registra um objeto COM com um CLSID específico, você pode verificar se esse CLSID está realmente registrado.

OK, é impossível, mas as DLLs geralmente se registram criando uma entrada no registro. Uma solução alternativa é:

  1. Primeiro você precisa descobrir o GUID COM da DLL. Se você possui uma máquina onde já está registrada, pode:
    1. Abra o regedit e procure pelo seu nome de arquivo DLL
    2. Se estiver registrado, você encontrará o nome do arquivo em uma chave que está no TypeLib. A chave será semelhante a: {9F3DBFEE-FD77-4774-868B-65F75E7DB7C2}
  2. Agora que você conhece o GUID da DLL, pode procurá-lo com este comando em um prompt do DOS: reg query HKCR\CLSID | find /i "{9F3DBFEE-FD77-4774-868B-65F75E7DB7C3}"

Uma resposta melhor me permitiria encontrar o GUID diretamente do arquivo antes de ser registrado. Pelo menos dessa maneira, você pode criar um script para instalar e verificar se ele foi instalado com sucesso.

Neves
fonte
4
Você não precisa conhecer o GUID de antemão. Uma abordagem mais simples seria procurar no registro o nome do arquivo DLL : se esse nome estiver listado em qualquer uma dessas chaves GUID, sim, a DLL foi realmente registrada.
Massimo
@ Massimo: mas como eu procuraria por isso? Em qual chave? Ele pode erroneamente exibir na história shell (por exemplo, tentou registrar, sem ser um admin)
neves
Sob HKCR, obviamente :) Ou pelo menos sob HKLM. Itens específicos do usuário (como histórico do shell) estão sob HKCU.
Massimo
@ Massimo: se você colocar uma resposta aqui com o comando shell para procurá-la, vou marcar como a resposta correta.
Nev
É o mesmo que o seu: use REG QUERYpara procurar o nome do arquivo DLL.
Massimo
13

Eu precisava verificar se uma DLL com nome específico está registrada e usei este comando no meu BAT:

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

Se, com o nível de erro, enviar o controle para o rótulo, sempre que reg querynão encontrar nada. Pode ser necessário alterar a parte do registro em que você pesquisa (no meu caso HKLM'..., o caminho mais específico, mais rápido, caso contrário, leva muito tempo).

A saída pode ser processada, se necessário, o GUID da entrada pode ser obtido, mas isso está fora do escopo do comando reg query.

virgo47
fonte
0

Para localizar entradas do registro (e opcionalmente objetos COM) para uma DLL na linha de comando , uma combinação das respostas de @ virgo47 e @neves funcionou melhor para mim.

  1. Encontre entradas do registro que contenham o nome da DLL. Essas entradas geralmente usam GUIDs como suas chaves.

    consulta de registro HKLM \ SOFTWARE \ Classes / s / f Whatever.dll

  2. (opcional) Encontre objetos COM que foram registrados para esses GUIDs. (O uso /s /f "{GUID}"deve ser mais rápido que | findstr /i "{GUID}". E | find /i "{GUID}"parece ser um erro de digitação (mas ainda não posso escrever comentários no Serverfault).)

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

Orafu
fonte