1 Chương9 Lập trìnhthưviện động 2 9.1. Giới thiệu thưviệnđộng - DLL Thưviện là một tập các đại lượng, các hàm cung cấp cho việc thực hiện các công việc cho các chươngtrình ứng dụng. Thưviện tĩnh (static library) được lập trình, dịch và liên kết với chươngtrình sử dụng nó. Dẫn đến các chươngtrình rất lớn khi lưu trữ, chiếm tài nguyên nhiều khi chạy, Thưviệnđộng (DLL) cho phép phép một chươngtrình sử dụng được lưu trữ độc lập với nó, chỉ khi chạy cần đến mới nạp vào máy. Nhằm mục đích giảm tải cho hệ thống khi chạy các ứng dụng. Minh họa thưviện động: Chươngtrình ứng dụng Thưviệnđộng EXE DLL Chạy chươngtrình ứng dụng EXE DLL compile l o a d i n g compile l o a d i n g 3 9.1. Giới thiệu thưviệnđộng – DLL Thưviệnđộng có 2 cơ chế làm việc: kiểu loadtime thưviện sẽ được nạp vào máy cùng với chươngtrình khi chạy, kiểu runtime thưviện được nạp vào máy mỗi khi chươngtrình cần, dùng xong sẽ giải phóng nó khỏi máy. Minh họa như sau: LoadTime RunTime DLL-1, DLL-2, DLL-3, ChươngtrìnhChươngtrình DLL-1 DLL-2 DLL-1 DLL-3 DLL-1 DLL-2 DLL-3 Chươngtrình DLL-1 DLL-2 DLL-1 DLL-3 4 9.2. Giao diện thưviện DLL Giao diện thưviện (interface) là các kiểu, đại lượng, hàm cung cấp cho chươngtrình ứng dụng, nó là cầu nối giữa ứng dụng với bên trong thư viện. Minh họa như sau: DLL Chươngtrình ứng dụng interface Chươngtrình không sử dụng được các thành phần này vì không có trên giao diện, mặc dù có trong thư viện. using using using 5 9.3. Các kiểu thưviện DLL Có hai kiểu thưviệnđộng có thể tạo trong lậptrình MFC - DLL mở rộng MFC và - DLL thông thường. Đối với thưviện DLL mở rộng MFC thì các giao diện có thể chứa các thành phần trong C++ và MFC và tất nhiên có thể sử dụng C++ và MFC để lậptrình tạo ra DLL. Chươngtrình liên kết tương ứng phải có cùng phiên bản với thưviện MFC của DLL. Thưviện DLL thông thường được lậptrình các thành phần từ đầu, tuy nhiên có thể dùng các thành phần cơ bản của ngôn ngữ và hệ thông như API, lệnh cơ bản, DLL1 MFC DLL2 DLL3 u s i n g DLL mở rộng từ MFC DLL thông thường DLL có sử dụng MFC 6 9.4. Các bước lậptrình DLL Project DLL kiểu [Win32 Dynamic-Link Library], tạo bằng VC, được tổ chức thành các tệp chính là *.CPP và *.DEF Các bước chính lậptrình DLL Bước 1: Lậptrình các hàm, lớp, đối tượng, trong thư viện. Lập trong tệp *.CPP. Bước 2: Lậptrình giao diện cho thư viện, trong tệp *.DEF, hoặc thực hiện trực tiếp trong tệp *.CPP. Định nghĩa giao diện qua tệp *.DEF LIBRARY " tên của thưviện " DESCRIPTION ' mô tả thưviện ' EXPORTS entryname [=internalname] [@ordinal[NONAME]] Định nghĩa giao diện trực tiếp trong môđun *.cpp __declspec(dllexport) khai-báo-thành-phần; class __declspec(dllexport) khai-báo-lớp; Các tệp tin chươngtrình cho DLL được viết bình thường Chú ý: Phải đặt Project theo chế độ DLL là thay /subsystem:windows bằng /dll trong mục Link của Setting. 7 9.5. Sử dụng DLL trong chươngtrình Có hai cách liên kết chương trình với thưviện DLL, tường minh (explicite) và không tường minh (implicite). Liên kết không tường minh Bước 1: Bạn phải chép cả hai tệp của thưviệnđộng là .DLL và .LIB vào thư mục của chươngtrình để thực hiện liên kết. Bước 2: Bạn thiết lập cho chươngtrình của bạn có thêm liên kết với thưviện DLL bằng cách chọn chức năng "Project" "Setting" Chọn thẻ "Link" trên hộp thoại này và gõ vào ô "Object/Library modules" tên tệp .LIB của thưviệnđộng tương ứng. Bước 3: Trong chươngtrình bạn phải khai báo nhận các thành phần có sử dụng từ giao diện của thưviệnđộng bằng cú pháp sau: __declspec(dllimport) khai-báo-thành-phần; Chúng ta thấy khai báo này tương tự như khai báo giao diện cho thưviệnđộng nhưng ở đây sử dụng từ khóa dllimport thay cho dllexport. Bước 4: Bạn có thể dùng các thành phần đã khai báo như bình thường trong chương trình. Các liên kết này áp dụng cho kiểu giao diện định nghĩa trực tiếp trong *.cpp 8 9.5. Sử dụng DLL trong chươngtrình Liên kết tường minh Bước 1: Gọi hàm LoadLibrary() để nạp thưviện DLL vào máy và lưu giữ số hiệu của module tương ứng với thưviện được nạp. Mẫu hàm: HMODULE LoadLibrary( LPCTSTR filename ); Bước 2: Gọi hàm GetProcAddress() để xác định địa chỉ của một hàm, địa chỉ của biến nhớ, trong thưviện sau khi được nạp, địa chỉ hàm này được lưu bởi con trỏ hàm và dùng để gọi hàm. FARPROC GetProcAddress( HMODULE hModule, LPCSTR lpProcName ); Hàm trả về kiểu con trỏ hàm tương ứng với tên hàm. typedef kiểu-hàm ( *kiểu-con-trỏ)( các-kiểu-tham-số); Sau đó dùng kiểu-con-trỏ để khai báo các con trỏ lưu địa chỉ hàm cần sử dụng trong chương trình. Nếu hàm callback thì có khai báo sau: typedef kiểu-hàm ( CALLBACK *kiểu-con-trỏ)( các-kiểu-tham-số); Bước 3: Gọi hàm FreeLibrary() sau khi đã sử dụng xong các hàm trong thư viện. Mẫu hàm như sau: BOOL AFXAPI FreeLibrary( HMODULE hInstLib ); 9 9.5. Sử dụng DLL trong chươngtrình Khai báo các thành viên xuất ra của DLL (không cần tệp DEF) như sau: #define DllExport __declspec( dllexport ) class DllExport khai báo thành phần cần xuất; Ví dụ: class DllExport C { virtual int func( void ) { return 1; } }; DllExport int x=10; DllExport void sum( int x, int y) { return x+y; } Đặt tên tệp thưviện (*.LIB) vào mục [Object Library] của Setting Project. Khai báo thành phần của thưviện để sử dụng trong chương trình: #define DllImport __declspec( dllimport ) Ví dụ: class DllImport C { virtual int func( void ); }; DllImport int x; DllImport void sum( int x, int y); . 1 Chương 9 Lập trình thư viện động 2 9. 1. Giới thiệu thư viện động - DLL Thư viện là một tập các đại lượng, các hàm. dụng xong các hàm trong thư viện. Mẫu hàm như sau: BOOL AFXAPI FreeLibrary( HMODULE hInstLib ); 9 9.5. Sử dụng DLL trong chương trình Khai báo các thành viên xuất ra của DLL (không cần tệp DEF). trình Chương trình DLL-1 DLL-2 DLL-1 DLL-3 DLL-1 DLL-2 DLL-3 Chương trình DLL-1 DLL-2 DLL-1 DLL-3 4 9. 2. Giao diện thư viện DLL Giao diện thư viện (interface) là các kiểu, đại lượng, hàm cung cấp