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

pdf43 trang | Chuyên mục: Visual C++ | Chia sẻ: dkS00TYs | Lượt xem: 1881 | Lượt tải: 1download
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:

  • pdfBài giảng Lập trình Windows - Thư viện liên kết động (DLL - Dynamic Link Library).pdf
Tài liệu liên quan