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