các thư mục sau:
Nơi chứa chương trình ứng dụng gọi DLL
Thư mục hiện hành
Thư mục system, system32
Thư mục Windows
Các thư mục được liệt kê trong biến môi trường PATH
Cách thức gọi DLL trong ứng dụng – Load-time Ứng dụng sẽ gọi hàm export của DLL một cách “tường minh” (giống như cách gọi hàm của 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) của DLL Ứng dụng sẽ nạp DLL ngay thời điểm đầu tiên chương trình chạy Ưu điểm: Đơn giản, dễsửdụng vì giống như cách dùng thư viện tĩnh Khuyết điểm: Nếu không tìm ra DLL lúc nạp, ứng dụng sẽkết thúc ngay
Spring 2004
C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 31
Cách thức gọi DLL trong ứ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 các hàm, biến IMPORT từ DLL
Gọi hàm của thư viện DLL như gọi hàm bình thường Cách thức gọi DLL trong ứng dụng – Run-time Cách làm: Ứng dụng sẽdùng hàm LoadLibrary hay LoadLibraryEx để nạp DLL tại thời điểm cần thiết
Sau khi DLL được nạp, ứng dụng sẽdùng hàm
GetProcAddress để lấy địa chỉ của hàm export trong DLL
Ứng dụng sẽgọi hàm export trong DLL bằng cách dùng con trỏhàm trả về từ hàm
GetProcAddress
Spring 2004
C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 33
Cách thức gọi DLL trong ứ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ể hiện thông báo lỗi do ứng dụng qui định Cách thức gọi DLL trong ứng dụng – Run-time…(tt) Ví dụ: gọi hàm myFunc(LPTSTR)từ thư viện MYDLL.DLL // Định nghĩa Prototype của hàm typedef VOID (*MYPROC)(LPTSTR); HINSTANCE hinstLib;
MYPROC ProcAddr;
// Nạp DLL và lấy handle của DLL module hinstLib = LoadLibrary(“MYDLL");
// Nếu load thành công, lấy địa chỉ của hàm myFunc // trong DLL
if (hinstLib != NULL) {
ProcAddr = (MYPROC) GetProcAddress(hinstLib, "myFunc"); // Nếu lấy được địa chỉ hàm, gọi thực hiện hàm if (ProcAddr != NULL)
(ProcAddr) (“A parameter string \n"); // Giải phóng thư viện DLL
Spring 2004
C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 35
Lập trình C trên Windows