2011-01-25 33 views
7

Khi nào một liên kết ngầm hoặc rõ ràng liên kết đến một tệp DLL và thực tiễn hoặc cạm bẫy phổ biến là gì?Ngụ ý và liên kết rõ ràng với một DLL

+1

ý của bạn là gì? bạn có nghĩa là bằng cách sử dụng LoadLibrary hoặc liên kết tĩnh? – tenfour

+1

@tenfour tiềm ẩn là khi bạn sử dụng một .h và cần phải liên kết với một .lib và rõ ràng khi bạn sử dụng LoadLibrary và GetProcAddress tương ứng. Liên kết tĩnh là một kẹo cao su khác. – Shinnok

+1

Thỉnh thoảng bạn sử dụng rõ ràng khi bạn không có tệp .lib. –

Trả lời

8

Khá hiếm khi liên kết rõ ràng một DLL. Chủ yếu là vì nó là đau đớn và dễ bị lỗi. Bạn cần phải viết khai báo con trỏ hàm cho hàm được xuất và nhận mã LoadLibrary + GetProcAddress + FreeLibrary ngay. Bạn sẽ làm như vậy chỉ khi bạn cần một phụ thuộc thời gian chạy trên một phong cách trình cắm thêm DLL hoặc muốn chọn từ một tập hợp các DLL dựa trên cấu hình. Hoặc để đối phó với phiên bản, một hàm API chỉ có sẵn trên các phiên bản sau của Windows chẳng hạn. Liên kết rõ ràng là mặc định cho COM và .NET DLL.

Thông tin cơ bản khác trong số MSDN Library article này.

4

Tôi giả định bạn tham chiếu đến liên kết bằng cách sử dụng .lib so với tải DLL động bằng cách sử dụng LoadLibrary().

Tải tệp DLL tĩnh bằng cách liên kết đến .lib thường an toàn hơn. Giai đoạn liên kết kiểm tra rằng tất cả các điểm nhập tồn tại trong thời gian biên dịch và không có cơ hội bạn sẽ tải một DLL mà không có chức năng bạn đang mong đợi. Nó cũng dễ dàng hơn không phải sử dụng GetProcAddress().

Vì vậy, thông thường bạn chỉ nên sử dụng tính năng tải động khi được yêu cầu hoàn toàn.

5

Tôi đồng ý với những người khác đã trả lời bạn (Hans Passant và shoosh). Tôi chỉ muốn thêm hai thứ:

1) Một trường hợp phổ biến khi bạn phải sử dụng LoadLibraryGetProcAddress như sau: bạn chỉ muốn sử dụng một số API mới trong các phiên bản mới của Windows, nhưng API không quan trọng trong ứng dụng. Vì vậy, bạn kiểm tra với LoadLibraryGetProcAddress cho dù chức năng bạn cần tồn tại và sử dụng nó trong trường hợp đó. Chương trình của bạn làm gì nếu các hàm không tồn tại phụ thuộc hoàn toàn từ việc triển khai của bạn.

2) Có một tùy chọn quan trọng mà bạn không bao gồm trong câu hỏi của mình: delayed loading of DLLs. Trong trường hợp này hệ điều hành sẽ tải DLL khi một trong các hàm của nó được gọi và không phải lúc khởi động ứng dụng. Nó cho phép sử dụng thư viện nhập khẩu (.lib tệp) trong một số trường hợp mà liên kết rõ ràng nên được sử dụng ở giao diện đầu tiên. Hơn nữa nó cải thiện thời gian khởi động của các ứng dụng và được sử dụng rộng rãi bởi chính Windows. Vì vậy, cách này cũng được khuyến khích.

+0

Tải chậm trễ được thực hiện bởi trình liên kết Visual Studio, không phải hệ điều hành. Nó chèn các cuộc gọi 'LoadLibrary' và' GetProcAddress' thích hợp cho bạn. Hệ điều hành không nhận thức được ai đã thực hiện các cuộc gọi này. Đó là lý do tại sao nó hoạt động trở lại Window 95, mặc dù tính năng được giới thiệu trong 98. – MSalters

+0

@MSalters: Bạn đã sai. Chương trình thực thi (PE) được sử dụng tải chậm trễ có phần 'IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT' bổ sung. – Oleg

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