Bài giảng 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
Tóm tắt nội dung Bài giảng Lập trình Windows - Thư viện liên kết động (DLL - Dynamic Link Library), để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
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)
File đính kèm:
- Bài giảng Lập trình Windows - Thư viện liên kết động (DLL - Dynamic Link Library).pdf