Woher weiß ich, ob eine DLL registriert ist?

28

Wenn Sie eine DLL auf alten Computern (Windows XP) registrieren, meldet regsrv immer, dass die Registrierung erfolgreich war. Dies geschieht auch dann, wenn der Benutzer keine Berechtigung zur Registrierung hat.

Gibt es unter dem Namen der DLL einen Befehl, den ich in der Befehlszeile ausführen kann, um zu überprüfen, ob eine DLL installiert ist?

Neves
quelle

Antworten:

22

Ich habe diesen Link gefunden: Wie kann ich feststellen, ob eine DLL registriert wurde? :

Angesichts der Tatsache, dass die DLL-Registrierung beliebige Operationen umfassen kann, gibt es keine allgemeine Möglichkeit, festzustellen, ob eine Registrierung für eine beliebige DLL stattgefunden hat.

Um festzustellen, ob eine DLL registriert wurde, müssen Sie domänenspezifisches Wissen einbringen. Wenn Sie wissen, dass eine DLL ein COM-Objekt mit einer bestimmten CLSID registriert, können Sie überprüfen, ob diese CLSID tatsächlich registriert ist.

OK, es ist unmöglich, aber DLLs registrieren sich normalerweise selbst und erstellen einen Eintrag im Register. Eine Problemumgehung besteht darin,

  1. Zuerst müssen Sie die COM-GUID der DLL ermitteln. Wenn Sie eine Maschine haben, auf der sie bereits registriert ist, können Sie:
    1. Öffnen Sie regedit und suchen Sie nach Ihrem DLL-Dateinamen
    2. Wenn es registriert ist, finden Sie den Dateinamen unter einem Schlüssel, der sich unter der TypeLib befindet. Der Schlüssel sieht folgendermaßen aus: {9F3DBFEE-FD77-4774-868B-65F75E7DB7C2}
  2. Nachdem Sie die DLL-GUID kennen, können Sie mit diesem Befehl in einer DOS-Eingabeaufforderung danach suchen: reg query HKCR\CLSID | find /i "{9F3DBFEE-FD77-4774-868B-65F75E7DB7C3}"

Eine bessere Antwort würde es mir ermöglichen, die GUID direkt aus der Datei zu finden, bevor sie registriert wurde. Zumindest auf diese Weise können Sie ein Skript erstellen, um es zu installieren und zu überprüfen, ob es erfolgreich installiert wurde.

Neves
quelle
4
Sie müssen die GUID nicht unbedingt vorher kennen. Ein einfacherer Ansatz wäre, die Registrierung nach dem DLL- Dateinamen zu durchsuchen : Wenn dieser Name unter einem dieser GUID-Schlüssel aufgeführt ist, wurde die DLL tatsächlich registriert.
Massimo
@ Massimo: aber wie würde ich danach suchen? In welchem ​​Schlüssel? Es kann fälschlicherweise im Shell-Verlauf angezeigt werden (z. B. wurde versucht, sich zu registrieren, ohne ein Administrator zu sein)
Neves
Offensichtlich unter HKCR :) Oder zumindest unter HKLM. Benutzerspezifische Dinge (wie der Shell-Verlauf) stehen unter HKCU.
Massimo
@Massimo: Wenn Sie hier eine Antwort mit dem Shell-Befehl eingeben, um danach zu suchen, werde ich sie als die richtige Antwort markieren.
Neves
Es ist dasselbe wie bei Ihnen: Verwenden Sie REG QUERY, um nach dem DLL-Dateinamen zu suchen.
Massimo
13

Ich musste überprüfen, ob eine DLL mit einem bestimmten Namen registriert ist, und ich habe diesen Befehl in meinem BAT verwendet:

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

Wenn mit errorlevel Kontrolle an das Label gesendet wird reg query, wenn nichts gefunden wird. Möglicherweise müssen Sie den Teil der Registrierung ändern, in dem Sie suchen (in meinem Fall HKLM'..., je spezifischer der Pfad, desto schneller, sonst dauert es sehr lange).

Die Ausgabe kann bei Bedarf verarbeitet werden, die GUID für den Eintrag kann abgerufen werden, dies liegt jedoch außerhalb des Bereichs des Befehls reg query.

virgo47
quelle
0

Um Registrierungseinträge (und optional COM-Objekte) für eine DLL über die Befehlszeile zu finden , hat eine Kombination der Antworten von @ virgo47 und @neves für mich am besten funktioniert.

  1. Suchen Sie nach Registrierungseinträgen, die den DLL-Namen enthalten. Diese Einträge verwenden normalerweise GUIDs als Schlüssel.

    Reg-Abfrage HKLM \ SOFTWARE \ Classes / s / f whatever.dll

  2. (Optional) Suchen Sie nach COM-Objekten, die für diese GUIDs registriert wurden. (Verwenden /s /f "{GUID}"sollte schneller sein als | findstr /i "{GUID}". Und | find /i "{GUID}"scheint ein Tippfehler zu sein (aber ich kann noch keine Kommentare zu Serverfault schreiben).)

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

Orafu
quelle