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
Trả lời
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.
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.
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 LoadLibrary
và GetProcAddress
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 LoadLibrary
và GetProcAddress
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.
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
@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
- 1. Ngụ ý và triển khai rõ ràng giao diện
- 2. Ngụ ý và lệnh khai báo
- 3. CHỌN DISTINCT ngụ ý một loại kết quả
- 4. Ngụ ý bình đẳng trong kết hợp mẫu Haskell
- 5. Tải Lười biếng rõ ràng so với tải Lấp lánh rõ ràng
- 6. AutoCompleteBox và SearchText Rõ ràng
- 7. rõ ràng và tiềm ẩn C#
- 8. Subimplicits rõ ràng
- 9. macosx-version-min ngụ ý điều gì?
- 10. hiện gần() ngụ ý flush() trong Python?
- 11. Liên kết đến một địa chỉ lớn nhận biết DLL
- 12. Visual C++ - Liên kết plugin DLL với EXE?
- 13. Cú pháp PHP thú vị: một 'ngụ ý nếu'?
- 14. SQL: NULL như ColumnName ngụ ý
- 15. Lệnh tệp Linux: SYSV ngụ ý gì?
- 16. boost :: asio - Làm rõ ràng ràng buộc với một giao diện mạng cụ thể
- 17. Làm thế nào để liên kết một .DLL tĩnh?
- 18. Xác định các phôi ngầm rõ ràng và rõ ràng cho các giao diện C#
- 19. PostgreSQL: UPDATE ngụ ý di chuyển trên phân vùng
- 20. Liên kết không được quản lý C++ DLL với quản lý C++ lớp thư viện DLL
- 21. Ngụ ý của việc sử dụng Facebook offline_access
- 22. Liên kết dll trong Visual Studio
- 23. Tạo một DLL trong C và liên kết nó từ một dự án C++
- 24. Để ràng buộc rõ ràng với^l trong Bash
- 25. Gọi điện System.gc() một cách rõ ràng?
- 26. Phạm vi động - Ràng buộc sâu và Liên kết nông
- 27. Tiêu đề và liên kết nội bộ chú ý
- 28. SDL2 hiển thị kết cấu rõ ràng nằm sau chuột
- 29. Liên kết một ObservableCollection với một ListView
- 30. Lib và DLL liên kết với lỗi exe "không thể đọc tại 0x300"
ý 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
@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
Thỉnh thoảng bạn sử dụng rõ ràng khi bạn không có tệp .lib. –