[DLL] Giới thiệu về thư viện liên kết động (DLL)

Thư viện liên kết động (Dynamic Link Library – DLL) là 1 thư viện cho phép các ứng dụng có thể liên kết đến và sử dụng nó. Nó được xem là 1 tổ hợp các hàm và dữ liệu mà có thể được sử dụng bởi nhiều ứng dụng khác nhau ở cùng 1 thời điểm.

Khi đã được viết và đóng gói trong DLL, một hàm có thể được sử dụng ở bất cứ ứng dụng nào dưới dạng mã máy của nó mà không phải quan tâm đến mã nguồn của nó được viết ra sao.

Ưu điểm của DLL

  • Giảm không gian sử dụng bộ nhớ.
  • Giảm Swapping (thay trang bộ nhớ chính)
  • Có thể đóng gói và đưa vào chương trình khác
  • Tạo ra khả năng tương tác giữa các ngôn ngữ lập trình
  • Dễ dàng đưa ra hỗ trợ sau khi đã chuyển giao ứng dụng cho khách hàng

Khuyết điểm

  • Khó sử dụng

Export DLL

Để sử dụng được các mã lệnh trong DLL đã biên dịch, ta phải export nó ra cho các ứng dụng khác sử dụng.

Có 2 cách để export DLL:

  1. Sứ dụng .def file để export DLL.
  2. Sử dụng __declspec (dllexport) trong định nghĩa hàm, class.

Hàm Entry – Point của DLL.

Cũng giống như các chương trình C/C++ có hàm main, thì một DLL cũng có 1 hàm đặc biệt là hàm Entry – Point (DllMain). Tuy nhiên một DLL ta có thể tùy chọn có hoặc không có hàm này.

Nếu như hàm Entry – Point được định nghĩa nó sẽ được gọi bởi hệ thống trong trường hợp:

  • Các tiến trình và thread được khởi tạo hay kết thúc
  • Khi gọi hàm LoadLibrary hay FreeLibrary.

Dưới đây là cấu trúc của hàm DllMain.


BOOL APIENTRY DllMain(HMODULE /* hModule */, DWORD ul_reason_for_call, LPVOID /* lpReserved */)
{
   
   switch (ul_reason_for_call)
   {
 
      case DLL_PROCESS_ATTACH:
 
      case DLL_THREAD_ATTACH:
 
      case DLL_THREAD_DETACH:
 
      case DLL_PROCESS_DETACH:
 
      break;
 
   }
 
   return TRUE;

}

DLL_PROCESS_ATTACH : Khi 1 tiến trình nạp DLL lần đầu tiên.

DLL_THREAD_ATTACH : Khi 1 thread gọi 1 hàm trong DLL

DLL_THREAD_DETACH : Khi 1 thread kết thúc việc sử dụng DLL hoặc gọi hàm FreeLibrary

DLL_PROCESS_DETACH : Khi 1 tiến trình gỡ bỏ ra khỏi DLL hoặc kết thúc việc dùng các hàm trong DLL, hoặc lời gọi hàm FreeLibrary().

Cách sử dụng DLL

Khi đã có DLL rồi làm sao ta sử dụng được với ứng dụng của mình ?

Có 2 cách để sử dụng DLL

  • Liên kết không tường minh (Implicit Linking) : Các DLL sẽ được nạp ở thời điểm biên dịch chương trình (Load-time dynamic linking)
  • Liên kết tường minh (Explicit Linking) : DLL sẽ được nạp lúc run-time (Run-time Dynamic Linking), sử dụng con trỏ hàm để trỏ tới các hàm trong DLL mà ta cần sử dụng.

Trong bài viết này mình và các bạn chỉ đi qua những vấn đề cơ bản nhất của DLL. Trong những bài viết tới mình và các bạn sẽ tìm hiểu về cách tạo 1 DLL trong Visual Studio và sử dụng nó trong project cụ thể thế nào.

Leave A Comment?