Lập trình C Windows
Lập trình C Windows Thư viện liên kết động (DLL – Dynamic Link Library) Nguyễn Tri Tuấn Khoa CNTT – ĐH.KHTN.Tp.HCM Email: nttuan@ fit.hcmuns.edu.vn Nội dung Giới thiệu Xây dựng DLL Cách thức gọi DLL ứng dụng C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 Giới thiệu Liên kết (Linking) ? Các loại thư viện Định nghĩa DLL DLL chế quản lý nhớ C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 Giới thiệu - Liên kết (Linking) ? Liên kết cách thức mà trình biên dịch nhúng/kết hợp đoạn mã thực thi module thư viện (Lib) vào chương trình Có cách liên kết: Liên kết tĩnh (Static linking) Liên kết động (Dynamic linking) C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 Giới thiệu – Các loại thư viện Thư viện liên kết tĩnh (Static linking library) Dạng file: LIB Chứa mã lệnh nhị phân hàm thư viện Dùng để nhúng vào file chương trình thực giai đoạn liên kết (linking) trình biên dịch Trình biên dịch copy đoạn mã lệnh hàm thư viện vào module gọi Ưu điểm: Dễ thực Chương trình chạy độc lập, khơng cần file kèm theo Chương trình chạy nhanh (nếu kích thước nhỏ) C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 Giới thiệu – Các loại thư viện…(tt) Thư viện liên kết tĩnh (tt) Khuyết điểm: Đoạn mã lệnh nhúng vào file chương trình kích thước chương trình lớn, tốn nhớ Đoạn mã lệnh nhúng vào nhiều file chương trình khác không tối ưu Khi thay đổi hàm thư viện phải biên dịch lại toàn file chương trình C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 Giới thiệu – Các loại thư viện…(tt) Thư viện liên kết động (Dynamic linking library) Dạng file: LIB DLL File Lib: Thư viện nhập (Import library) Không chứa mã lệnh hàm, Chỉ chứa thông tin cần thiết để Hệ điều hành nạp thư viện DLL xác định hàm export DLL Sử dụng dùng cách thức load-time dynamic linking File DLL: Chứa mã lệnh nhị phân hàm thư viện Được tải vào nhớ ứng dụng gọi hàm thư viện Cần có thực ứng dụng Mã lệnh hàm không nhúng vào file chương trình ứng dụng Ứng dụng cần lưu thông tin hàm thư viện, cần, Hệ điều hành tải hàm thư viện vào nhớ C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 Giới thiệu – Các loại thư viện…(tt) Thư viện liên kết động (tt) Ưu điểm: Kích thước ứng dụng nhỏ Nhiều ứng dụng dùng chung DLL, đó, tiết kiệm nhớ (thơng thường, ứng dụng có data riêng, chia xẻ mã lệnh) Khi khơng cịn sử dụng, giải phóng DLL khỏi nhớ Khi cần nâng cấp, chchỉ cần thay file DLL, file chương trình khác khơng bị ảnh hưởng Khuyết điểm: Khó sử dụng C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 Giới thiệu - Định nghĩa DLL Là thư viện chứa hàm liệu gọi từ module khác (module ứng dụng EXE DLL khác) DLL nạp vào nhớ lúc run-time map vào vùng nhớ tiến trình gọi DLL chứa loại hàm thư viện: Export: phép gọi từ module khác Internal: dùng nội DLL C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 Giới thiệu - DLL chế quản lý nhớ Mỗi tiến trình (process) nạp DLL vào không gian địa ảo (virtual address space) tiến trình Hệ điều hành quản lý biến đếm (Count) cho DLL Biến Count tăng lên DLL nạp (bởi hàm LoadLibrary); bị giảm giải phóng (bởi hàm FreeLibrary) Khi biến Count=0 hay process kết thúc, DLL giải phóng khỏi nhớ C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 10 Giới thiệu - DLL chế quản lý nhớ…(tt) Các hàm DLL thực thi “ngữ cảnh” tiểu trình (Thread) gọi hàm, đó: DLL sử dụng Stack tiểu trình DLL sử dụng khơng gian địa ảo tiến trình gọi DLL cấp phát nhớ cho biến động không gian địa ảo tiến trình gọi C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 11 Xây dựng DLL Xây dựng DLL thư viện Win32 API Xây dựng DLL thư viện MFC C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 12 Xây dựng DLL – Dùng thư viện Win32 API Ví dụ tạo lập DLL Phân tích khai báo Phân tích hàm DllMain Ví dụ liên kết DLL với ứng dụng C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 13 Xây dựng DLL – Dùng thư viện Win32 API…(tt) Ví dụ tạo lập DLL Chọn menu File New Chọn tab Projects Chọn loại project “Win32 Dynamic Link Library” Đặt tên project xác định đường dẫn thư mục ô “Location” Step 1: Chọn loại ứng dụng “A DLL that exports some symbols” Nhấn Finish để kết thúc C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 14 Xây dựng DLL – Dùng thư viện Win32 API…(tt) Phân tích khai báo .h #define DLLEXPORT #define DLLIMPORT declspec(dllexport) declspec(dllimport) // Ví dụ khai báo biến “xuất khẩu” DLLEXPORT int nDll=0; // Ví dụ khai báo hàm “xuất khẩu” DLLEXPORT int fnDll(void); dllexport (xuất khẩu): cung cấp hàm, liệu, tài nguyên,… cho chương trình/DLL khác sử dụng C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 15 Xây dựng DLL – Dùng thư viện Win32 API…(tt) Phân tích khai báo (tt) dllimport (nhập khẩu): load hàm, hay liệu, hay tài nguyên,… từ DLL khác để sử dụng Mỗi DLL .h Import hàm/dữ liệu từ DLL #definevà Export hàm/dữ liệu khác; DLLIMPORT declspec(dllimport) // Ví dụ khai báo biến “nhập khẩu” DLLIMPORT int nDll; // Ví dụ khai báo hàm “nhập khẩu” DLLIMPORT int fnDll(void); C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 16 Xây dựng DLL – Dùng thư viện Win32 API…(tt) Phân tích hàm DllMain .cpp BOOL APIENTRY DllMain( HANDLE 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; } C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 17 Xây dựng DLL – Dùng thư viện Win32 API…(tt) Phân tích hàm DllMain (tt) Hàm DllMain hàm đầu vào DLL Hàm DllMain gọi DLL load vào nhớ Windows yêu cầu DLL kết thúc (unload khỏi nhớ) Hàm DllMain có nhiệm vụ khởi tạo giải phóng tài nguyên sử dụng cho DLL (nếu có) Các tham số: hModule: handle DLL, Windows tạo ul_reason_for_call: nguyên nhân hàm DllMain gọi C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 18 Xây dựng DLL – Dùng thư viện Win32 API…(tt) Phân tích hàm DllMain (tt) DLL_PROCESS_ATTACH: Hàm DllMain với tham số DLL_PROCESS_ATTACH gọi process tiến hành load DLL Thư viện DLL Windows ánh xạ vào vùng nhớ tiến trình (thực lời gọi DLL) Đây hội để DLL khởi tạo biến, cấp phát vùng nhớ hay thao tác cần thiết khác trước cho phép tiến trình gọi đến hàm thư viện DLL_PROCESS_DETATCH: Thư viện DLL giải phóng khỏi vùng nhớ tiến trình nguyên nhân: nạp DLL không thành công, tiến trình kết thúc, hay tiến trình gọi hàm FreeLibrary Đây hội để giải phóng biến hay tài nguyên mà DLL cấp phát C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 19 Xây dựng DLL – Dùng thư viện Win32 API…(tt) Phân tích hàm DllMain (tt) DLL_THREAD_ATTACH: Khi tiến trình tạo tiểu trình (thread), Windows gọi hàm DllMain tất thư viện DLL sử dụng với tiến trình Đây hội để khởi tạo biến dùng cho tiểu trình Lưu ý tình xảy tiểu trình tạo sau thư viện DLL load vào tiến trình, có nghĩa DLL load hàm LoadLibrary tất tiểu trình có (trong tiến trình) không gọi hàm DllMain với tham số DLL_THREAD_DETACH: Khi tiểu trình kết thúc, Windows gọi hàm DllMain tất thư viện DLL sử dụng với tiến trình Đây hội để giải phóng biến dùng cho tiểu trình C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 20 10 Xây dựng DLL – Dùng thư viện Win32 API…(tt) Ví dụ liên kết DLL với ứng dụng C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 21 Xây dựng DLL – Dùng thư viện MFC Ví dụ tạo lập DLL Phân tích khai báo Định nghĩa hàm export Các dạng thư viện DLL MFC C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 22 11 Xây dựng DLL – Dùng thư viện MFC…(tt) Ví dụ tạo lập DLL Chọn menu File New Chọn tab Projects Chọn loại project “MFC AppWizard (dll)” Đặt tên project xác định đường dẫn thư mục ô “Location” Step 1: Chọn loại ứng dụng “Regular DLL using shared MFC DLL” Nhấn Finish để kết thúc C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 23 Xây dựng DLL – Dùng thư viện MFC…(tt) Phân tích khai báo CMyDllApp: lớp kế thừa từ lớp CWinApp, quản lý toàn DLL class CMyDllApp : public CWinApp { public: CMyDllApp(); DECLARE_MESSAGE_MAP() }; C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 24 12 Xây dựng DLL – Dùng thư viện MFC…(tt) Định nghĩa hàm export .cpp #define DLLEXPORT #define DLLIMPORT declspec(dllexport) declspec(dllimport) // Ví dụ khai báo hàm “xuất khẩu” DLLEXPORT int fnDll(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); // Các lệnh hàm … … … } C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 25 Xây dựng DLL – Dùng thư viện MFC…(tt) Các dạng thư viện DLL MFC C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 26 13 Xây dựng DLL – Dùng thư viện MFC…(tt) Các dạng thư viện DLL MFC Regular DLL: Chỉ export hàm theo dạng C-style, export class, hàm thành phần class, hàm định nghĩa chồng (overloaded function) Các ứng dụng Win32 MFC dùng với loại DLL “with MFC statically linked”: DLL liên kết với DLL chuẩn MFC theo cách liên kết tĩnh “using shared MFC DLL”: DLL liên kết với DLL chuẩn MFC theo cách liên kết động MFC Extention DLL: Cho phép export class Ứng dụng khác tạo object từ class, xây dựng lớp kế thừa từ class DLL liên kết với DLL chuẩn MFC theo cách liên kết động Chỉ có ứng dụng MFC dùng với loại DLL C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 27 Cách thức gọi DLL ứng dụng Cách thức tìm kiếm file DLL Load-time Dynamic Linking Run-time Dynamic Linking C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 28 14 Cách thức tìm kiếm file DLL Hệ điều hành Windows tìm file DLL thư mục sau: Nơi chứa chương trình ứng dụng gọi DLL Thư mục hành Thư mục system, system32 Thư mục Windows Các thư mục liệt kê biến môi trường PATH C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 29 Cách thức gọi DLL ứng dụng – Load-time Ứng dụng gọi hàm export DLL cách “tường minh” (giống cách gọi hàm thư viện liên kết tĩnh) Ứng dụng cần phải liên kết với file thư viện nhập (Import Lib) DLL Ứng dụng nạp DLL thời điểm chương trình chạy Ưu điểm: Đơn giản, dễ sử dụng giống cách dùng thư viện tĩnh Khuyết điểm: Nếu khơng tìm DLL lúc nạp, ứng dụng kết thúc C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 30 15 Cách thức gọi DLL ứng dụng – Load-time…(tt) Cách làm: Add file thư viện nhập (DllName.lib) vào project Khai báo hàm, biến IMPORT từ DLL Gọi hàm thư viện DLL gọi hàm bình thường C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 31 Cách thức gọi DLL ứng dụng – Run-time Cách làm: Ứng dụng dùng hàm LoadLibrary hay LoadLibraryEx để nạp DLL thời điểm cần thiết Sau DLL nạp, ứng dụng dùng hàm GetProcAddress để lấy địa hàm export DLL Ứng dụng gọi hàm export DLL cách dùng trỏ hàm trả từ hàm GetProcAddress Cách không cần dùng đến file thư viện nhập (Import Lib.) C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 32 16 Cách thức gọi DLL ứng dụng – Run-time…(tt) Ưu điểm: Có thể xử lý lỗi khơng tìm thấy DLL, tránh kết thúc ứng dụng tức thời, thể thông báo lỗi ứng dụng qui định C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 33 Cách thức gọi DLL ứng dụng – Run-time…(tt) Ví dụ: gọi hàm myFunc(LPTSTR) từ thư viện MYDLL.DLL // Định nghĩa Prototype hàm typedef VOID (*MYPROC)(LPTSTR); HINSTANCE hinstLib; MYPROC ProcAddr; // Nạp DLL lấy handle DLL module hinstLib = LoadLibrary(“MYDLL"); // Nếu load thành công, lấy địa hàm myFunc // DLL if (hinstLib != NULL) { ProcAddr = (MYPROC) GetProcAddress(hinstLib, "myFunc"); // Nếu lấy địa hàm, gọi thực hàm if (ProcAddr != NULL) (ProcAddr) (“A parameter string \n"); // Giải phóng thư viện DLL FreeLibrary(hinstLib); } C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 34 17 Cám ơn - Hỏi & Đáp C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 35 18 ... “with MFC statically linked”: DLL liên kết với DLL chuẩn MFC theo c? ?ch liên kết tĩnh “using shared MFC DLL”: DLL liên kết với DLL chuẩn MFC theo c? ?ch liên kết động MFC Extention DLL: Cho phép... th? ?c mà trình biên dịch nhúng /kết hợp đoạn mã th? ?c thi module thư viện (Lib) vào chương trình C? ? c? ?ch liên kết: Liên kết tĩnh (Static linking) Liên kết động (Dynamic linking) C4 W - DLL - Nguyen... giai đoạn liên kết (linking) trình biên dịch Trình biên dịch copy đoạn mã lệnh hàm thư viện vào module gọi Ưu điểm: Dễ th? ?c Chương trình chạy đ? ?c lập, khơng c? ??n file kèm theo Chương trình chạy nhanh