Đạ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:
[email protected]
Đạ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)