Khác biệt giữa bản sửa đổi của “Dynamic Link Library”

Nội dung được xóa Nội dung được thêm vào
Addbot (thảo luận | đóng góp)
n Bot: Di chuyển 27 liên kết ngôn ngữ đến Wikidata tại d:q380319 Addbot
Cheers!-bot (thảo luận | đóng góp)
nKhông có tóm lược sửa đổi
Dòng 33:
Ta tưởng tượng có hai tiến trình sử dụng cùng một DLL, một tiến trình kết thúc công việc của nó và thoát ra. Nhưng DLL sẽ không gỡ bỏ ra khỏi [[bộ nhớ]] vì DLL quản lý [[thời gian]] tồn tại của nó bằng cách giữ một bộ đếm tham khảo cho các tiến trình sử dụng nó. Mỗi khi có một tiến trình nào đó yêu cầu sử dụng DLL, bộ đếm tham khảo sẽ tăng giá trị của nó lên 1; còn khi có một tiến trình gỡ bỏ không sử dụng nữa thì bộ đếm lại giảm đi 1. DLL sẽ tự động xóa bỏ ra khỏi bộ nhớ chừng nào bộ đếm tham khảo trở về 0, trạng thái cho biết không còn có tiến trình nào sử dụng DLL nữa.
Bây giờ giả sử có một tiến trình bắt đầu chạy và yêu cầu hệ thống nạp một DLL hiện đang được dùng bởi một ứng dụng đã chạy trước đó. Chuyện gì sẽ xảy ra? Liệu hệ thống có nạp DLL một lần nữa không? Hiển nhiên là không, vì DLL được định nghĩa ra để có thể dùng chung giữa các ứng dụng khác nhau. Thành phần đã nạp DLL có tất cả các hàm và [[dữ liệu]] của nó trong bộ nhớ và hệ thống sẽ chỉ phải ánh xạ chúng tới không gian địa chỉ của tiến trình mới cho chúng hoạt động. Nó liên quan đến việc đọc các hàm và dữ liệu DLL từ trên đĩa.
 
=== Có thể đóng gói và đưa vào chương trình khác ===
Khi đã xây dựng được một DLL với các chức năng hợp lý, ta có thể sử dụng nó trong bất cứ ứng dụng nào mà ta cảm thấy thích hợp. Ví dụ trong một ứng dụng nhỏ, ta có tập hợp các hàm chuyển đổi giá trị từ String sang ngày tháng và đóng gói nó vào trong một DLL. Khi đó, ở một ứng dụng khác, khi có nhu cầu chuyển đổi như trên, thì ta sẽ không phải viết lại các hàm hoặc đính kèm [[mã nguồn]] của các hàm đó vào chương trình đó nữa mà sử dụng trực tiếp DLL mà ta đã [[trình biên dịch|biên dịch]].
 
=== Tạo ra khả năng tương tác giữa các [[ngôn ngữ lập trình]] ===
Dòng 49:
Là khó khăn lớn nhất thỉnh thoảng gặp khi dùng DLL. Ta có thể gặp những thông báo lỗi dạng như:
The ordinal abc could not be located in the dynamic-link library xyz.dll
hoặc khi [[cài đặt]] một ứng dụng mới, một số chương trình khác đang bình thường bỗng nhiên bị trục trặc hoặc thậm chí không thể nạp lên để chạy được.
 
Đó là các dấu hiệu của DLL Hell trên [[máy tính]] của ta. Nguyên nhân cơ bản của sự cố trên là do [[chương trình cài đặt]] không kiểm tra phiên bản của các DLL trước khi sao lưu nó vào trong [[thư mục hệ thống]]. Khi một DLL mới thay thế một DLL cũ có sẵn, và nếu DLL mới này có một số thay đổi lớn làm cho nó không thể tương thích ngược lại với các chương trình sử dụng phiên bản cũ, nó sẽ làm rối loạn chương trình đó.
Dòng 77:
==== Hàm Entry-Point của DLL ====
 
Một DLL có thể chứa rất nhiều hàm, nhưng có một hàm đặc biệt là hàm Entry-point (tạm dịch là hàm đầu vào). Theo định nghĩa của thư viện MSDN, hàm DLLMain() là điểm vào của một DLL (một DLL có thể tùy chọn có hoặc không có hàm này).Nếu như hàm này được sử dụng, nó có thể được gọi bởi [[hệ thống]] trong trường hợp:
 
* Các tiến trình và tuyến (thread) được khởi tạo hay kết thúc
Dòng 130:
Thư viện import chỉ chứa các thông tin về thành phần được export từ DLL mà không có một dòng lệnh giúp trình biên tập (linker) xử lý các lời gọi hàm tới DLL. Khi trình biên tập tìm thấy thông tin về hàm export trong một file .lib, và giả sử như mã lệnh của hàm đó nằm trong một DLL có sẵn, thì để xử lý các tham chiếu đến hàm, trình biên tập phải nhúng thêm một số thông tin vào file thực thi cuối cùng, thành phần được dùng bởi bộ nạp hệ thống khi mà tiến trình khởi động.
 
Khi bộ nạp (loader) chuẩn bị chạy một chương trình, trong đó có chứa các liên kết động, thì nó sẽ sử dụng thông tin được nhúng (ở thời điểm biên dịch, như đã nói ở trên) vào file thực thi chương trình để xác định các thư viện yêu cầu. Nếu như nó không thể tìm được DLL, thì hệ thống sẽ chấm dứt tiến trình và hiện ra một hộp thoại để thông báo lỗi tương ứng. Ngược lại, hệ thống sẽ nạp DLL (nếu như trước đó nó chưa được nạp) và ánh xạ các module DLL (hàm và lớp) vào trong không gian địa chỉ của tiến trình. Chú ý rằng mỗi tiến trình đều có một không gian địa chỉ riêng, do vậy nên nhiều tiến trình có thể sử dụng chung một DLL. Khi đó địa chỉ hàm được gọi sẽ nằm trong không gian này.
 
Nếu như DLL nào đó có hàm Entry-point (như đã đề cập ở phần trước), hệ thống sẽ gọi hàm này. Tham số fdwReason sẽ có giá trị là DLL_PROCESS_ATTACH, xác định rằng DLL đang được gắn vào tiến trình. Nếu như giá trị trả về của hàm Entry-point không phải là TRUE, hệ thống sẽ bỏ dở việc nạp tiến trình và thông báo lỗi.
Dòng 138:
==== Liên kết tường minh (Explicit Linking) ====
 
Liên kết tường minh hay còn gọi là liên kết ở thời điểm chạy (Run-time Dynamic Linking): sử dụng các con trỏ hàm ở thời điểm chạy chương trình để trỏ tới các hàm trong DLL mà ta cần sử dụng. Modul sẽ dùng hàm LoadLibrary hoặc hàm LoadLibraryEx để nạp DLL khi nào nó muốn sử dụng hàm trong DLL. Sau khi DLL đã được nạp, modul sử dụng hàm GetProcAddress để lấy về địa chỉ trỏ tới hàm xuất ra trong DLL và đưa vào một con trỏ hàm nào đó. Các thao tác tiếp theo của modul sẽ làm việc với con trỏ hàm này.
 
Hầu hết các ứng dụng được phát triển đều sử dụng liên kết ở thời điểm nạp (load-time dynamic linking) bởi vì đó là cách liên kết dễ dàng nhất. Nhưng dựa vào một số các ràng buộc, thỉnh thoảng phương pháp trên là không cần thiết. Sau đây là một số trường hợp cụ thể nên dùng liên kết ở thời điểm chạy thay thế: