Lập trình Windows - Bài 08

Thư viện liên kết động (DLL – DYNAMIC LINK LIBRARY) GIỚI THIỆU – LIÊN KẾT LÀ GÌ ? NDOWS - DLL 􀂙 Thư viện là một tập tin chứa những hàm hoặc tài nguyên khác có sẵn mà các ứng dụng có thể lấy để sử d Cá tài ê à th ờ h hé hiề ứ RÌNH WI ĐỘNG dụng. Các nguyên này thường cho phép nhiều ứng dụng cùng chia sẻ sử dụng dễ dàng một đoạn mã hoặc tài nguyên 􀂙 Liên kết là cách thức mà trình biên dịch nhúng/kết hợp các đoạn mã thực thi của những module thư viện Lib) vào chương trình 􀂙 Có 2 cách liên kết: 􀂙Liên kết tĩnh 􀂙Liên kết động

pdf43 trang | Chia sẻ: tlsuongmuoi | Lượt xem: 1983 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Lập trình Windows - Bài 08, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Đại Học Sư Phạm Tp. Hồ Chí Minh Khoa Toán – Tin Học LẬP TRÌNH WINDOWS ếThư viện liên k t động (DLL – DYNAMIC LINK LIBRARY) • Giới thiệu thư viên liên kết • Các loại thư viện liên kết • Xây dựng thư viện liên kết động Trần Ngọc Bảo - Email: tnbao.dhsp@gmail.com Đại Học Sư Phạm Tp. Hồ Chí Minh Khoa Toán – Tin Học LẬP TRÌNH WINDOWS ếThư viện liên k t động (DLL – DYNAMIC LINK LIBRARY) • Giới thiệu thư viên liên kết • Các loại thư viện liên kết • Xây dựng thư viện liên kết động S S GIỚI THIỆU – LIÊN KẾT LÀ GÌ ? N D O W S N D O W S - - D L L D L L CT Kế toán CT Nhân sự CT Tiền lương R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ Source Source Source code Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N code code I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N KT.EXE NS.EXE TL.EXE B À I G I B À I G I T H Ư T H Ư CSDL CSDL CSDL TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (3) S S GIỚI THIỆU – LIÊN KẾT LÀ GÌ ? N D O W S N D O W S - - D L L D L L CT Kế t á CT Nhân CT Tiền lương R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G o n sự N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ Source Source Source code Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N code code I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N KT.EXE NS.EXE TL.EXE B À I G I B À I G I T H Ư T H Ư TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (4) CSDL S S GIỚI THIỆU – LIÊN KẾT LÀ GÌ ? N D O W S N D O W S - - D L L D L L Module Kế toán Module Tiền lương R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N KT.DLL DataAccess.DLL TL.DLL I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N B À I G I B À I G I T H Ư T H Ư CSDL TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (5) S S GIỚI THIỆU – LIÊN KẾT LÀ GÌ ? N D O W S N D O W S - - D L L D L L ™ Thư viện là một tập tin chứa những hàm hoặc tài nguyên khác có sẵn mà các ứng dụng có thể lấy để sử d Cá tài ê à th ờ h hé hiề ứ R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G ụng. c nguy n n y ư ng c o p p n u ng dụng cùng chia sẻ sử dụng dễ dàng một đoạn mã hoặc tài nguyên N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ ™ Liên kết là cách thức mà trình biên dịch nhúng/kết hợp á ủ ệ ( ) à Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N c c đoạn mã thực thi c a những module thư vi n Lib v o chương trình I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N ™ Có 2 cách liên kết: ™Liên kết tĩnh B À I G I B À I G I T H Ư T H Ư ™Liên kết động TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (6) Đại Học Sư Phạm Tp. Hồ Chí Minh Khoa Toán – Tin Học LẬP TRÌNH WINDOWS ếThư viện liên k t động (DLL – DYNAMIC LINK LIBRARY) • Giới thiệu thư viên liên kết • Các loại thư viện liên kết • Xây dựng thư viện liên kết động S S GIỚI THIỆU – CÁC LOẠI THƯ VIỆN N D O W S N D O W S - - D L L D L L ™ Thư viện liên kết tĩnh (Static Linking Library) R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G - Dạng file: .LIB Chứ ã lệ h hị hâ ủ á hà th iệ N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ - a m n n p n c a c c m ư v n - Dùng để nhúng vào file chương trình khi thực hiện giai đoạn Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N liên kết (linking) của quá trình biên dịch - Trình biên dịch sẽ copy đoạn mã lệnh của các hàm thư viện I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N vào trong những module gọi chúng B À I G I B À I G I T H Ư T H Ư TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (8) S S THƯ VIỆN LIÊN KẾT TĨNH N D O W S N D O W S - - D L L D L L Thư viện liên kết Chương trình chính R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G Source code Source code N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N Compiler Compiler I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N LIB OBJ files Linker B À I G I B À I G I T H Ư T H Ư AB.EXE TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (9) S S THƯ VIỆN LIÊN KẾT TĨNH N D O W S N D O W S - - D L L D L L ™ Ưu điểm Dễ thực hiện R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G - - Chương trình có thể chạy độc lập, không cần các file kèm theo N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ - Chương trình chạy nhanh hơn vì không cần thực hiện load thư viện ™ Khuyết điểm Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N - Đoạn mã lệnh được nhúng vào chương trình Æ kích thước chương trình lớn, tốn bộ nhớ. I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N - Đoạn mã lệnh được nhúng vào nhiều file chương trình khác nhau Æ không tối ưu B À I G I B À I G I T H Ư T H Ư - Khi thay đổi hàm thư viện Æ phải biên dịch lại toàn bộ các file chương trình TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (10) S S THƯ VIỆN LIÊN KẾT ĐỘNG N D O W S N D O W S - - D L L D L L ™ Thư viện liên kết động (Dynamic Linking Library) R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G - Dạng file: .LIB và DLL - File LIB N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ . ƒ Thư viện nhập (Import Library) ƒ Không chứa mã lệnh của các hàm ầ ế ể ề Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N ƒ Chỉ chứa các thông tin c n thi t đ hệ đi u hành nạp thư viện DLL và xác định các hàm export trong DLL ƒ Sử dụng khi dùng cách thức load – time dynamic linking I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N - File .DLL ƒ Chứa mã lệnh nhị phân của các hàm thư viện B À I G I B À I G I T H Ư T H Ư ƒ Được tải vào bộ nhớ khi ứng dụng gọi hàm thư viện ƒ Cần phải chép tập tin đi kèm khi thực thi ứng dụng TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (11) S S THƯ VIỆN LIÊN KẾT ĐỘNG N D O W S N D O W S - - D L L D L L S Thư viện liên kết Chương trình chính R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G ource code (Source file) Source code N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ Source code Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N Compiler Compiler(Header files) I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N DLL OBJ files Linker B À I G I B À I G I T H Ư T H Ư AB.EXE TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (12) S S THƯ VIỆN LIÊN KẾT ĐỘNG N D O W S N D O W S - - D L L D L L ™ Ưu điểm - Mã lệnh của các hàm sẽ không được nhúng vào trong file chương trình của ứng R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G dụng Æ Kích thước của ứng dụng nhỏ - Ứng dụng chỉ cần lưu thông tin của hàm thư viện, khi cần hệ điều hành sẽ load các hàm thư viện vào bộ nhớ N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ - Nhiều ứng dụng có thể dùng chung 1 DLL. Do đó, tiết kiệm bộ nhớ (thông thường mỗi ứng dụng có data riêng, nhưng có thể chia sẻ mã lệnh) Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N - Khi không còn sử dụng, có thể giải phóng DLL khỏi bộ nhớ - Khi cần nâng cấp, chỉ cần thay thế file DLL, các file chương trình khác không bị ảnh hưởng I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N ™ Khuyết điểm B À I G I B À I G I T H Ư T H Ư - Khó sử dụng hơn TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (13) Đại Học Sư Phạm Tp. Hồ Chí Minh Khoa Toán – Tin Học LẬP TRÌNH WINDOWS ếThư viện liên k t động (DLL – DYNAMIC LINK LIBRARY) • Giới thiệu thư viên liên kết • Các loại thư viện liên kết • Xây dựng thư viện liên kết động S S XÂY DỰNG DLL N D O W S N D O W S - - D L L D L L ™ Xây dựng thư viện DLL bằng thư viện Win32API R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N B À I G I B À I G I T H Ư T H Ư Chọn loại Project: “Win32 Dynamic Link Library” TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (15) S S XÂY DỰNG DLL N D O W S N D O W S - - D L L D L L ™ Xây dựng thư viện DLL bằng thư viện MFC R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N B À I G I B À I G I T H Ư T H Ư Chọn loại Project: “MFC AppWizard(Dll)” TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (16) S S XÂY DỰNG DLL DÙNG THƯ VIỆN WIN32 API N D O W S N D O W S - - D L L D L L ™ Tạo lập DLL R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G â í h á kh bá N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ ™ Ph n t c c c ai o Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N ™ Phân tích hàm DllMain I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N ™ Demo liên kết DLL với ứng dụng B À I G I B À I G I T H Ư T H Ư TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (17) S S XÂY DỰNG DLL DÙNG THƯ VIỆN WIN32 API N D O W S N D O W S - - D L L D L L ™ Chọn menu File Æ New R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G ™ Chọn Tab Projects ™ Chọn loại project “Win32 Dynamic Link Library” N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ ™ Đặt tên project trong ô “Project name” Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N ™ Xác định đường dẫn thư mục trong “Location” ™ St 1 Ch l i ứ d “A DLL th t t I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N ep : ọn oạ ng ụng a expor s some symbols” ấ ể ế ú B À I G I B À I G I T H Ư T H Ư ™ Nh n “Finish” đ k t th c TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (18) S S XÂY DỰNG DLL DÙNG THƯ VIỆN WIN32 API N D O W S N D O W S - - D L L D L L ™ dllexport: cung cấp hàm, dữ liệu, tài nguyên,…cho các chương trình/DLL khác sử dụng R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G #define DLLEXPORT __declspec(dllexport) //Khai báo 1 biến “xuất khẩu” N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ DLLEXPORT int nMyValue; //Khai báo 1 hàm “xuất khẩu” DLLEXPORT int MyFunction(void) Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N ™ dllimport: load 1 hàm, dữ liệu, tài nguyên,…từ 1 DLL khác để sử dụng I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N #define DLLIMPORT __declspec(dllimport) //Khai báo 1 biến “nhập khẩu” B À I G I B À I G I T H Ư T H Ư DLLIMPORT int nMyValue; //Khai báo 1 hàm “nhập khẩu” DLLIMPORT int MyFunction(void) TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (19) S S XÂY DỰNG DLL DÙNG THƯ VIỆN WIN32 API N D O W S N D O W S - - D L L D L L ™ Phân tích hàm DllMain R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ ) { switch (ul reason for call) Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N _ _ _ { case DLL_PROCESS_ATTACH: case DLL THREAD ATTACH: I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N _ _ case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; B À I G I B À I G I T H Ư T H Ư } return TRUE; } TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (20) S S XÂY DỰNG DLL DÙNG THƯ VIỆN WIN32 API N D O W S N D O W S - - D L L D L L ™ Phân tích hàm DllMain (tt) R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G ƒ Hàm DllMain là hàm chính của DLL ƒ Hàm DllMain được gọi khi DLL được load vào bộ nhớ hoặc khi Windows ê ầ DLL kết thú ( l d khỏi bộ hớ) N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ y u c u c un oa n ƒ Hàm DllMain có nhiệm vụ khởi tạo hoặc giải phóng các tài nguyên sử dụng cho DLL đó (nếu có) Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N ƒ Các tham số: • hModule: handle của DLL do Windows tạo ra I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N , • ul_reason_for_call: lý do hàm DllMain được gọi B À I G I B À I G I T H Ư T H Ư TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (21) S S XÂY DỰNG DLL DÙNG THƯ VIỆN WIN32 API N D O W S N D O W S - - D L L D L L ™ Phân tích hàm DllMain (tt) ƒ DLL_PROCESS_ATTACH: R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G • Hàm DllMain với tham số DLL_PROCESS_ATTACH được gọi khi process tiến hành load DLL N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ • Thư viện DLL đang được Windows ánh xạ vào vùng nhớ của tiến trình (thực hiện lời gọi DLL) • Đây là thời điểm để DLL khởi tạo các biến cấp phát vùng nhớ hay những Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N , thao tác cần thiết khác trước khi cho phép tiến trình gọi đến các hàm của thư viện I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N ƒ DLL_PROCESS_DETACH: • Thư viện DLL được giải phóng khỏi vùng nhớ của tiến trình do 1 trong 3 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 B À I G I B À I G I T H Ư T H Ư , , hàm FreeLibrary • Đây là thời điểm để giải phóng các biến hay tài nguyên mà DLL đã cấp phát TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (22) S S XÂY DỰNG DLL DÙNG THƯ VIỆN WIN32 API N D O W S N D O W S - - D L L D L L ™ Phân tích hàm DllMain (tt) ƒ DLL THREAD ATTACH: R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G _ _ • Khi tiến trình tạo mới một tiểu trình (Thread), Windows gọi hàm DllMain của tất cả các thư viện DLL đang được sử dụng với tiến trình đó. N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ • Đây là thời điểm để khởi tạo các biến dùng cho tiểu trình • Lưu ý rằng tình huống này chỉ xảy ra khi tiểu trình được tạo sau khi thư viện DLL đã load ào tiến trình nghĩa là nế DLL đ ợc load bằng hàn LoadLibrar thì Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N v , u ư y tất cả các tiểu trình hiện có (trong tiến trình) sẽ không gọi hàm DllMain với tham số này. I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N ƒ DLL_THREAD_DETACH: • Khi 1 tiểu trình kết thúc, Windows gọi hàm DllMain của tất cả các thư viện DLL ử ể B À I G I B À I G I T H Ư T H Ư đang được s dụng với ti u trình này. • Đây là thời điểm để giải phóng các biến dùng cho tiểu trình TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (23) S S LIÊN KẾT DLL VỚI ỨNG DỤNG WIN32 API N D O W S N D O W S - - D L L D L L ™ Tạo Project loại “Win32 Dynamic Link Library”, với tên “MyWin32DLL” R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G ™ Tạo Project loại “Win32 Application” với tên là “MyWin32Sample” N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ ™ Biên dịch và chạy chương trình Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N ™ Copy tập tin MyWin32DLL.DLL vào thư mục Debug của “MyWin32Sample” I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N ™ Copy tập tin MyWin32DLL.LIB và tập tin MyWin32DLL.H vào thư mục MyWin32Sample B À I G I B À I G I T H Ư T H Ư ™ Add tập tin MyWin32DLL.LIB vào project MyWin32Sample TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (24) S S XÂY DỰNG DLL DÙNG THƯ VIỆN MFC N D O W S N D O W S - - D L L D L L ™ Tạo lập DLL R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G ™ Phân tích các khai báo N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ ™Đị h hĩ hà t Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N n ng a m expor I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N ™ Các dạng thư viện DLL của MFC B À I G I B À I G I T H Ư T H Ư ™ Liên kết DLL với ứng dụng TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (25) S S XÂY DỰNG DLL DÙNG THƯ VIỆN MFC N D O W S N D O W S - - D L L D L L ™ Chọn menu File Æ New R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G ™ Chọn Tab Projects ™ Chọn loại project “MFC AppWizard (dll)” N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ ™ Đặt tên project trong ô “Project name” Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N ™ Xác định đường dẫn thư mục trong “Location” ™ St 1 Ch l i ứ d “R l DLL i I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N ep : ọn oạ ng ụng egu ar us ng shared MFC DLL” hoặc “MFC Extension DLL” ấ ể ế ú B À I G I B À I G I T H Ư T H Ư ™ Nh n “Finish” đ k t th c TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (26) S S CÁC DẠNG THƯ VIỆN DLL CỦA MFC N D O W S N D O W S - - D L L D L L R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N B À I G I B À I G I T H Ư T H Ư TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (27) S S CÁC DẠNG THƯ VIỆN DLL CỦA MFC N D O W S N D O W S - - D L L D L L ƒ Regular DLL: • Chỉ export các hàm theo dạng C-style, không thể export class, hàm thành phần của class các hàm định nghĩa chồng (o erloaded f nction) R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G , v u • Các ứng dụng Win32 và MFC đều có thể sử dụng loại DLL • “with MFC statically linked”: DLL sẽ được liên kết với các DLL chuẩn của MFC N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ theo cách liên kết tĩnh • “using shared MFC DLL”: DLL sẽ được liên kết với các DLL chuẩn của MFC th á h liê kết độ Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N eo c c n ng ƒ MFC Extention DLL: I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N • Cho phép export các class. Ứng dụng khác có thể tạo các project từ các class, hoặc xây dựng các lới kế thừa từ class này. B À I G I B À I G I T H Ư T H Ư • DLL sẽ được liên kết với các DLL chuẩn của MFC theo cách liên kết động • Chỉ có các ứng dụng MFC mới có thể dùng với loại DLL này. TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (28) S S CÁCH THỨC GỌI DLL TRONG ỨNG DỤNG N D O W S N D O W S - - D L L D L L ™ Cách thức tìm kiếm file DLL R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G ™ Load time Dynamic Linking N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ - Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N ™Run-time Dynamic Linking I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N B À I G I B À I G I T H Ư T H Ư TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (29) S S ỨNG DỤNG TÌM KIẾM FILE DLL N D O W S N D O W S - - D L L D L L ™ Hệ điều hành Windows sẽ tìm file DLL có sử dụng trong ứng dụng theo thứ tự các thư mục sau R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G - Thư mục chứa tập tin EXE gọi DLL này N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ - Thư mục hiện hành h 32 Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N - T ư mục system, system - Thư mục Windows I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N - Các thư mục được liệt kê trong biến môi trường PATH B À I G I B À I G I T H Ư T H Ư TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (30) S S CÁCH THỨC GỌI DLL TRONG ỨNG DỤNG – Load-time N D O W S N D O W S - - D L L D L L ™ Ứ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) R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G ™ Ứng dụng cần phải liên kết với file thư viện nhập (Import Lib) của DLL N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ ™ Ứng dụng sẽ nạp DLL ngay thời điểm đầu tiên chương trình chạ Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N ™ Ưu điểm: I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N - Đơn giản, dễ sử dụng vì giống như cách dùng thư viện tĩnh ™ Khuyết điểm: B À I G I B À I G I T H Ư T H Ư - Nếu không tìm ra DLL lúc nạp, ứng dụng sẽ kết thúc ngay TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (31) S S CÁCH THỨC GỌI DLL TRONG ỨNG DỤNG – Load-time N D O W S N D O W S - - D L L D L L ™ Cách thực hiện R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G - Add file thư viện nhập (DLLName.Lib) vào project N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ - Khai báo các hàm, biến IMPORT từ DLL Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N - Gọi hàm của thư viện DLL như gọi hàm bình thường I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N B À I G I B À I G I T H Ư T H Ư TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (32) S S CÁCH THỨC GỌI DLL TRONG ỨNG DỤNG – Run-time N D O W S N D O W S - - D L L D L L ™ Ứng dụng sẽ gọi hàm LoadLibrary hay LoadLibraryEx để nạp DLL tại thời điểm cần thiết R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G ™ Sau khi DLL được nạp, ứng dụng sẽ dùng hàm GetProcessAddress để lấy địa chỉ của hàm export trong DLL N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ ™ Ứ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 GetProcessAddress Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N - Cách này không cần dùng đến file thư viện nhập (DllName LIB) ™ Ưu điểm: I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N . - 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 B À I G I B À I G I T H Ư T H Ư ™ Khuyết điểm: - Phức tạp, khó sử dụng trong cài đặt TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (33) S S CÁCH THỨC GỌI DLL TRONG ỨNG DỤNG – Run-time N D O W S N D O W S - - D L L D L L ™ Ví dụ: gọi hàm MyFunction(LPTSTR) từ thư viện MYDLL.DLL typedef VOID (*MYPRO) (LPTSTR); R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G HINSTANCE hInsLib ; MYPROC ProcAddr; (“ ) N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ hInsLib = LoadLibrary MYDLL” ; if (hInsLib !=NULL) { Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N ProcAddr = (MYPRO) GetProcessAddress(hInsLib,”MyFunction”); if (ProcAddr !=NULL) I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N { (ProcAddr)(“A parameter string”) ; F Lib (hI Lib) B À I G I B À I G I T H Ư T H Ư ree rary ns ; } } TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (34) S S XÂY DỰNG THƯ VIỆN DLL BẰNG MFC N D O W S N D O W S - - D L L D L L ™ Xây dựng thư viện MFC Extention DLL MyFirstDLL l AFX EXT CLASS CM Cl bli CObj t R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G c ass _ _ y ass : pu c ec { public: N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ void SetFirstName(CString s); void ShowMessageBox(); CMyClass(); Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N virtual ~CMyClass(); protected: I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N CString m_FirstName; }; B À I G I B À I G I T H Ư T H Ư TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (35) S S XÂY DỰNG THƯ VIỆN DLL BẰNG MFC N D O W S N D O W S - - D L L D L L ™ Xây dựng thư viện MFC Extention DLL MyFirstDLL CMyClass::CMyClass() R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G { m FirstName=“MyFirstDLL Sample"; N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ void CMyClass::ShowMessageBox() { _ } Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N AfxMessageBox(m_FirstName); } I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N void CMyClass::SetFirstName(CString s) { B À I G I B À I G I T H Ư T H Ư m_FirstName = s; } TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (36) S S XÂY DỰNG THƯ VIỆN DLL BẰNG MFC N D O W S N D O W S - - D L L D L L ™ Tạo ứng dụng MyFirstDLLSample sử dụng thư viện MyFirstDLL R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G void CMFCSampleDllView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ CMyClass my; my.ShowMessageBox(); Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N my.SetFirstName("abc"); my.ShowMessageBox(); I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N CView::OnLButtonDown(nFlags, point); } B À I G I B À I G I T H Ư T H Ư TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (37) S S XÂY DỰNG THƯ VIỆN DLL BẰNG MFC N D O W S N D O W S - - D L L D L L ™ Thay đổi hàm ShowMessageBox trong thư viện MyFirstDLL void CMyClass::ShowMessageBox() R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G { AfxMessageBox(m_FirstName); N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ } void CMyClass::ShowMessageBox() Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N { AfxMessageBox(m_FirstName); AfxMessageBox(“DllSample: ”+ m_FirstName); I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N } ™ Rebuild thư viện MyFirstDLL B À I G I B À I G I T H Ư T H Ư ™ Copy tập tin MyFirstDLL.DLL vào thư mục MyFirstDLLSample\Debug TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (38) S S XÂY DỰNG THƯ VIỆN DLL BẰNG MFC N D O W S N D O W S - - D L L D L L ™ Run chương trình MyFirstDLLSampleĐiều gì xảy ra khi click chuột trái lên màn R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G hình chương trình MyFirstDLLSample ? N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ void CMFCSampleDllView::OnLButtonDown(UINT nFlags, CPoint point) { Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N CMyClass my; my.ShowMessageBox(); I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N my.SetFirstName("abc"); my.ShowMessageBox(); B À I G I B À I G I T H Ư T H Ư CView::OnLButtonDown(nFlags, point); TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (39) } S S XÂY DỰNG THƯ VIỆN DLL BẰNG MFC N D O W S N D O W S - - D L L D L L ™ Xây dựng thư viện MySecondDLL MFC Extention DLL có sử dụng resource R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N B À I G I B À I G I T H Ư T H Ư TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (40) S S XÂY DỰNG THƯ VIỆN DLL BẰNG MFC N D O W S N D O W S - - D L L D L L ™Liên kết MySecondDLL với ứng dụng MyFirstDLLSample R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G void CMFCSampleDllView::OnRButtonDown(UINT nFlags, CPoint point) #include "MyLoginDlg.h" N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ { // TODO: Add your message handler code here and/or call default CMyLoginDlg dlg; Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N dlg.DoModal(); CView::OnRButtonDown(nFlags point); I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N , } B À I G I B À I G I T H Ư T H Ư TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (41) S S TÀI LIỆU THAM KHẢO N D O W S N D O W S - - D L L D L L ™ Charles Petzold (1998), Programming Windows Fifth Edition, Microsoft Press – Chapter 21 R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G ™ David J. Kruglinski (1998), Programming Microsoft Visual C++ Fifth Edition, Microsoft Press – Chapter 22 N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N B À I G I B À I G I T H Ư T H Ư TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (42) S S N D O W S N D O W S - - D L L D L L R Ì N H W I R Ì N H W I Đ Ộ N G Đ Ộ N G N L Ậ P T R N L Ậ P T R K Ế T Đ K Ế T Đ Ọ C P H Ầ N Ọ C P H Ầ N N L I Ê N N L I Ê N I Ả N G H Ọ I Ả N G H Ọ Ư V I Ệ N Ư V I Ệ N B À I G I B À I G I T H Ư T H Ư TRẦN NGỌC BẢO ” KHOA TOÁN -TIN HỌC ” ĐẠI HỌC SƯ PHẠM TP.HCM ” (43)

Các file đính kèm theo tài liệu này:

  • pdfLẬP TRÌNH WINDOWS bài 08.pdf
Tài liệu liên quan