Làm thế nào để tôi biết nếu một DLL được đăng ký?


28

Khi bạn đang đăng ký một DLL trong các máy cũ (Windows XP), regsrv luôn nói rằng việc đăng ký là thành công. Điều này xảy ra ngay cả khi người dùng không có quyền đăng ký.

Với tên của dll, có một lệnh mà tôi có thể chạy ở dòng lệnh để xác minh nếu một DLL được cài đặt không?

Câu trả lời:


22

Tôi đã tìm thấy liên kết này: Làm thế nào tôi có thể biết liệu DLL đã được đăng ký chưa? :

Cho rằng đăng ký DLL có thể bao gồm các hoạt động tùy ý, không có cách nào chung để xác định liệu đăng ký có diễn ra đối với một DLL tùy ý hay không.

Để xác định xem một DLL đã được đăng ký chưa, bạn cần mang theo kiến ​​thức cụ thể về tên miền. Nếu bạn biết rằng một DLL đăng ký một đối tượng COM với một CLSID cụ thể, bạn có thể kiểm tra xem CLSID đó có thực sự được đăng ký hay không.

OK, điều đó là không thể, nhưng DLL thường tự đăng ký tạo một mục trong sổ đăng ký. Một cách giải quyết là:

  1. Đầu tiên bạn phải khám phá COM GUID của DLL. Nếu bạn có một máy đã được đăng ký, bạn có thể:
    1. Mở regedit và tìm kiếm tên tệp DLL của bạn
    2. Nếu nó được đăng ký, bạn sẽ tìm thấy tên tệp dưới một khóa nằm dưới TypeLib. Khóa sẽ có dạng: {9F3DBFEE-FD77-4774-868B-65F75E7DB7C2}
  2. Bây giờ bạn đã biết DLL GUID, bạn có thể tìm kiếm nó bằng lệnh này trong lời nhắc của DOS: reg query HKCR\CLSID | find /i "{9F3DBFEE-FD77-4774-868B-65F75E7DB7C3}"

Một câu trả lời tốt hơn sẽ cho phép tôi tìm GUID trực tiếp từ tệp trước khi được đăng ký. Ít nhất theo cách này bạn có thể tạo một tập lệnh để cài đặt và xác minh nếu nó được cài đặt thành công.


4
Bạn thực sự không cần phải biết GUID trước. Một cách tiếp cận đơn giản hơn là tìm kiếm Registry cho tên tệp DLL : nếu tên đó được liệt kê dưới bất kỳ một trong các khóa GUID nào, thì có, DLL thực sự đã được đăng ký.
Massimo

@Massimo: nhưng tôi sẽ tìm kiếm nó như thế nào? Trong khóa nào? Nó có thể hiển thị sai trong lịch sử shell (ví dụ: đã cố đăng ký mà không phải là quản trị viên)
neves

Theo HKCR, rõ ràng :) Hoặc ít nhất là dưới HKLM. Những thứ dành riêng cho người dùng (như lịch sử vỏ) thuộc HKCU.
Massimo

@Massimo: nếu bạn đặt câu trả lời ở đây bằng lệnh shell để tìm kiếm nó, tôi sẽ đánh dấu nó là câu trả lời đúng.
Neves

Nó giống như của bạn: sử dụng REG QUERYđể tìm tên tệp DLL.
Massimo

13

Tôi cần kiểm tra xem một DLL với tên cụ thể đã được đăng ký chưa và tôi đã sử dụng lệnh này trong BAT của mình:

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

Nếu với errorlevel gửi điều khiển đến nhãn khi reg querykhông tìm thấy gì. Bạn có thể cần thay đổi một phần của sổ đăng ký nơi bạn tìm kiếm (trong trường hợp của tôi HKLM'..., đường dẫn càng cụ thể càng nhanh, nếu không sẽ mất nhiều thời gian).

Đầu ra có thể được xử lý nếu cần thiết, GUID cho mục nhập có thể được lấy, nhưng đó là ngoài phạm vi của lệnh truy vấn reg.


0

Để tìm các mục đăng ký (và các đối tượng COM tùy chọn) cho một DLL từ dòng lệnh , sự kết hợp các câu trả lời của @ virgo47 và @neves hoạt động tốt nhất với tôi.

  1. Tìm các mục đăng ký có chứa tên DLL. Các mục này thường sử dụng GUID làm khóa.

    reg truy vấn HKLM \ SOFTWARE \ Classes / s / f anything.dll

  2. (tùy chọn) Tìm các đối tượng COM đã được đăng ký cho các GUID này. (Việc sử dụng /s /f "{GUID}"phải nhanh hơn | findstr /i "{GUID}". Và | find /i "{GUID}"dường như là một lỗi đánh máy (nhưng tôi chưa thể viết bình luận trên Serverfault).)

    truy vấn reg HKCR \ CLSID / s / f "{9F3DBFEE-FD77-4774-868B-65F75E7DB7C3}"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.