2009-08-27 40 views
7

Tôi đang nói về win32 dlls, những tập tin pe đồng bằng. Tôi đang bối rối sau khi tôi làm một bài kiểm tra so với những gì tôi thấy trong quá trình explorer.exe.Chúng ta có thể có 2 DLL cùng tên đang được nạp trong một quá trình

  1. Tôi đã viết một bài kiểm tra với các module sau: (C++)
    DLLLoader.exe liên kết đến A.dll trong cùng một thư mục.
    B.dll liên kết đến A.dll (2) trong một thư mục khác. (A.dll (2) là một DLL hoàn toàn khác nhau từ A.dll, nhưng có cùng tên)
    DLLLoader.exe sẽ tải B.dll một cách rõ ràng thông qua :: LoadLibrary.
    Bây giờ tôi bắt đầu DllLoader.exe, trước tiên, A.dll sẽ được tải, nhưng sau đó khi nó cố gắng để tải B.dll, Nó chỉ thất bại: Tôi nghi ngờ đó là bởi vì B.dll nghĩ rằng A.dll đã được nạp trong quá trình , nhưng trên thực tế, một nạp không phải là một trong những B.dll muốn, bảng nhập khẩu/xuất khẩu không thể phù hợp, do đó, B.dll là không tải được.
    Điều này dường như cho chúng tôi biết chúng tôi không thể tải 2 dll cùng tên trong cùng một quá trình, ngay cả khi chúng có đường dẫn khác nhau.

  2. Nhưng khi tôi sử dụng quá trình thám hiểm để giám sát các module được nạp trong quá trình Windows explorer.exe, tôi có thể nhìn thấy sau 2 dlls được nạp, với cùng một tên:
    comctl32.dll Kinh nghiệm kiểm soát người dùng thư viện C: \ WINDOWS \ WinSxS ... \ comctl32.dll
    comctl32.dll Common Controls Library C: \ WINDOWS \ system32 \ comctl32.dll

bất kỳ của bạn có thể đổ một số đèn về điều này?

Trả lời

6

Về cơ bản nó phụ thuộc vào nếu bạn tải dll với đường dẫn đầy đủ của nó hoặc chỉ theo tên tệp. Các LoadLibraryEx docs che này khá tốt:

Nếu lpFileName không bao gồm một con đường và có nhiều hơn một nạp mô-đun với tên cơ sở cùng và mở rộng, hàm trả về một tay cầm đến module đã được tải trước tiên.

+0

Để hạn chế tải (dựa trên phụ thuộc DLL), chúng tôi chỉ có thể có 1 dll được tải cùng tên. –

Các vấn đề liên quan