web-dev-qa-db-fra.com

Comment savoir si un DLL est enregistré?

Lorsque vous enregistrez un 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'a pas l'autorisation de 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 un DLL est installé?

30
neves

J'ai trouvé ce lien: Comment puis-je savoir si un DLL a été enregistré? :

Étant donné que DLL l'enregistrement 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 un DLL a été enregistré, vous devez apporter des connaissances spécifiques au domaine. Si vous savez qu'un DLL enregistre un objet COM avec un particulier CLSID, vous pouvez vérifier si ce CLSID est bien 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 COM GUID de la DLL. Si vous avez une machine sur laquelle elle est déjà enregistrée, vous pouvez:
    1. Ouvrez regedit et recherchez votre DLL nom de fichier
    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 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 qu'il ne soit enregistré. Au moins de cette façon, vous pouvez créer un script à installer et vérifier s'il a été installé avec succès.

24
neves

Je devais vérifier si un DLL avec un nom particulier est enregistré 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, le contrôle est envoyé à l'étiquette quand _ reg query 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 le plus rapide, sinon cela prend très longtemps).

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

16
virgo47

Pour trouver des entrées de registre (et éventuellement des objets COM) pour un DLL depuis 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 qui contiennent le nom 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. (En utilisant /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 reg HKCR\CLSID/s/f "{9F3DBFEE-FD77-4774-868B-65F75E7DB7C3}"

0
Orafu