Comment savoir si une DLL est enregistrée?

28

Lorsque vous enregistrez une DLL sur d'anciennes machines (Windows XP), regsrv indique toujours que l'enregistrement a réussi. Cela se produit même si l'utilisateur n'est pas autorisé à s'enregistrer.

Avec le nom de la DLL, existe-t-il une commande que je peux exécuter sur la ligne de commande pour vérifier si une DLL est installée?

neves
la source

Réponses:

22

J'ai trouvé ce lien: comment savoir si une DLL a été enregistrée? :

Étant donné que l'enregistrement de DLL peut englober des opérations arbitraires, il n'existe aucun moyen général de déterminer si l'enregistrement a eu lieu pour une DLL arbitraire.

Pour déterminer si une DLL a été enregistrée, vous devez apporter des connaissances spécifiques au domaine. Si vous savez qu'une DLL enregistre un objet COM avec un CLSID particulier, vous pouvez vérifier si ce CLSID est effectivement enregistré.

OK, c'est impossible, mais les DLL s'enregistrent généralement en créant une entrée dans le registre. Une solution de contournement consiste à:

  1. Vous devez d'abord découvrir le GUID COM de la DLL. Si vous avez une machine sur laquelle elle est déjà enregistrée, vous pouvez:
    1. Ouvrez regedit et recherchez votre nom de fichier DLL
    2. S'il est enregistré, vous trouverez le nom de fichier sous une clé qui se trouve sous TypeLib. La clé ressemblera à: {9F3DBFEE-FD77-4774-868B-65F75E7DB7C2}
  2. Maintenant que vous connaissez le GUID de la DLL, vous pouvez le rechercher avec cette commande dans une invite DOS: reg query HKCR\CLSID | find /i "{9F3DBFEE-FD77-4774-868B-65F75E7DB7C3}"

Une meilleure réponse me permettrait de trouver le GUID directement à partir du fichier avant son enregistrement. Au moins de cette façon, vous pouvez créer un script à installer et vérifier s'il a été installé avec succès.

neves
la source
4
Vous n'avez pas réellement besoin de connaître le GUID à l'avance. Une approche plus simple serait de rechercher dans le Registre le nom de fichier de la DLL : si ce nom est répertorié sous l'une de ces clés GUID, alors oui, la DLL a bien été enregistrée.
Massimo
@Massimo: mais comment le rechercherais-je? Dans quelle clé? Il peut s'afficher à tort dans l'historique du shell (par exemple, a tenté de s'enregistrer sans être administrateur)
neves
Sous HKCR, évidemment :) Ou tout au moins sous HKLM. Les choses spécifiques à l'utilisateur (comme l'historique du shell) sont sous HKCU.
Massimo
@Massimo: si vous mettez une réponse ici avec la commande shell pour la rechercher, je la marquerai comme la bonne réponse.
neves
C'est le même que le vôtre: utilisez REG QUERYpour rechercher le nom du fichier DLL.
Massimo
13

J'avais besoin de vérifier si une DLL avec un nom particulier est enregistrée et j'ai utilisé cette commande dans ma BAT:

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

Si avec errorlevel a envoyé le contrôle à l'étiquette quand il reg queryn'a rien trouvé. Vous devrez peut-être modifier la partie du registre dans laquelle vous effectuez une recherche (dans mon cas HKLM'..., le chemin le plus spécifique est le plus rapide, sinon cela prend vraiment beaucoup de temps).

La sortie peut être traitée si nécessaire, le GUID de l'entrée peut être obtenu, mais cela est hors de portée de la commande de requête reg.

virgo47
la source
0

Pour trouver des entrées de registre (et éventuellement des objets COM) pour une DLL à partir de la ligne de commande , une combinaison des réponses de @ virgo47 et @neves a fonctionné le mieux pour moi.

  1. Recherchez les entrées de registre contenant le nom de la DLL. Ces entrées utilisent généralement des GUID comme clés.

    requête de reg HKLM \ SOFTWARE \ Classes / s / f quel que soit.dll

  2. (facultatif) Recherchez les objets COM qui ont été enregistrés pour ces GUID. (L'utilisation /s /f "{GUID}"devrait être plus rapide que | findstr /i "{GUID}". Et | find /i "{GUID}"semble être une faute de frappe (mais je ne peux pas encore écrire de commentaires sur Serverfault).)

    requête de requête HKCR \ CLSID / s / f "{9F3DBFEE-FD77-4774-868B-65F75E7DB7C3}"

Orafu
la source