Lập trình windows:Thư viện liên kết động

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ờ hhéhiề ứ

RÌNH WI RÌNH WI

ĐỘNG ĐỘNG

dụng. Các tàinguyê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

NLẬP TR NLẬP TR

KẾT Đ KẾT Đ

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 PHẦN ỌC PHẦN

NLIÊN NLIÊ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ẢNG HỌ IẢNG HỌ

ƯVIỆN ƯVIỆN

™Có 2 cách liên kết:

™Liên kếttĩnh

BÀI GI BÀI GI

THƯ THƯ

™Liên kết tĩnh

™Liên kết động

TRẦN NGỌC BẢO TRẦN NGỌC BẢO ”KHOA TOÁN KHOA TOÁN --TIN HỌC TIN HỌC ”ĐẠI HỌC SƯPHẠM TP.HCM ĐẠI HỌC SƯPHẠM TP.HCM ”((6 6)) TRẦN NGỌC BẢO TRẦN NGỌC BẢO ”KHOA TOÁN KHOA

pdf43 trang | Chia sẻ: oanh_nt | Lượt xem: 1232 | Lượt tải: 0download
Bạn đang xem trước 20 trang nội dung tài liệu Lập trình windows:Thư viện liên kết động, để 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

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

  • pdfc4w_bai_08.pdf
Tài liệu liên quan