Skąd mam wiedzieć, czy biblioteka DLL jest zarejestrowana?


28

Podczas rejestrowania biblioteki DLL na starych komputerach (Windows XP) regsrv zawsze mówi, że rejestracja się powiodła. Dzieje się tak, nawet jeśli użytkownik nie ma uprawnień do rejestracji.

Czy nazwa dll zawiera polecenie, które mogę uruchomić w wierszu polecenia, aby sprawdzić, czy biblioteka DLL jest zainstalowana?

Odpowiedzi:


22

Znalazłem ten link: Jak mogę sprawdzić, czy biblioteka DLL została zarejestrowana? :

Biorąc pod uwagę, że rejestracja DLL może obejmować dowolne operacje, nie ma ogólnego sposobu ustalenia, czy rejestracja miała miejsce dla arbitralnej DLL.

Aby ustalić, czy biblioteka DLL została zarejestrowana, musisz wprowadzić wiedzę dotyczącą konkretnej domeny. Jeśli wiesz, że biblioteka DLL rejestruje obiekt COM z określonym CLSID, możesz sprawdzić, czy ten CLSID jest rzeczywiście zarejestrowany.

OK, to niemożliwe, ale biblioteki DLL zwykle rejestrują się, tworząc wpis do rejestru. Obejściem tego problemu jest:

  1. Najpierw musisz znaleźć identyfikator GUID COM biblioteki DLL. Jeśli masz jedno urządzenie, na którym jest już zarejestrowane, możesz:
    1. Otwórz regedit i wyszukaj swoją nazwę pliku DLL
    2. Jeśli jest zarejestrowany, nazwę pliku znajdziesz pod kluczem pod TypeLib. Klucz będzie wyglądał następująco: {9F3DBFEE-FD77-4774-868B-65F75E7DB7C2}
  2. Teraz, gdy znasz identyfikator GUID biblioteki DLL, możesz wyszukać go za pomocą tego polecenia w wierszu polecenia DOS: reg query HKCR\CLSID | find /i "{9F3DBFEE-FD77-4774-868B-65F75E7DB7C3}"

Lepsza odpowiedź pozwoli mi znaleźć identyfikator GUID bezpośrednio z pliku przed jego rejestracją. Przynajmniej w ten sposób możesz utworzyć skrypt do zainstalowania i sprawdzić, czy został pomyślnie zainstalowany.


4
Tak naprawdę nie musisz znać GUID wcześniej. Prostszym podejściem byłoby przeszukanie rejestru w poszukiwaniu nazwy pliku DLL : jeśli nazwa ta znajduje się w jednym z tych kluczy GUID, to tak, biblioteka DLL rzeczywiście została zarejestrowana.
Massimo,

@Massimo: ale jak bym tego szukał? W jakim kluczu? Może niepoprawnie wyświetlać się w historii powłoki (np. Próbował zarejestrować się bez bycia administratorem)
neves

Oczywiście pod HKCR :) A przynajmniej pod HKLM. Rzeczy specyficzne dla użytkownika (np. Historia powłoki) są objęte HKCU.
Massimo,

@Massimo: jeśli umieścisz tutaj odpowiedź za pomocą polecenia powłoki, aby ją wyszukać, oznaczę ją jako poprawną odpowiedź.
neves

Jest taki sam jak twój: użyj, REG QUERYaby wyszukać nazwę pliku DLL.
Massimo,

13

Musiałem sprawdzić, czy biblioteka DLL o określonej nazwie jest zarejestrowana i użyłem tego polecenia w mojej BAT:

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

Jeśli z poziomem błędu wysłano kontrolę do etykiety, gdy reg querynic nie znaleziono. Może być konieczna zmiana części rejestru, w której przeprowadzasz wyszukiwanie (w moim przypadku HKLM'...im bardziej konkretna ścieżka, tym szybciej, w przeciwnym razie zajmuje to naprawdę dużo czasu).

W razie potrzeby dane wyjściowe można przetworzyć, można uzyskać identyfikator GUID dla wpisu, ale jest to poza zakresem polecenia reg query.


0

Aby znaleźć wpisy rejestru (i opcjonalnie obiekty COM) dla biblioteki DLL z wiersza poleceń , kombinacja odpowiedzi @ virgo47 i @neves działała dla mnie najlepiej.

  1. Znajdź wpisy rejestru zawierające nazwę DLL. Te wpisy zwykle używają identyfikatorów GUID jako swoich kluczy.

    reg zapytanie HKLM \ SOFTWARE \ Classes / s / fokolwiek.dll

  2. (opcjonalnie) Znajdź obiekty COM, które zostały zarejestrowane dla tych identyfikatorów GUID. (Używanie /s /f "{GUID}"powinno być szybsze niż | findstr /i "{GUID}". I | find /i "{GUID}"wydaje się literówką (ale nie mogę jeszcze pisać komentarzy na temat błędu serwera).)

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.