Thứ Bảy, 8 tháng 2, 2014

Lập trình C Windows 14_thư viện liên kết động

1
Lập trình C trên Windows
Thư viện liên kết động
(DLL – Dynamic Link Library)
Nguyễn Tri Tuấn
Khoa CNTT – ĐH.KHTN.Tp.HCM
Email: nttuan@ fit.hcmuns.edu.vn
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 2
Nội dung

Giới thiệu

Xây dựng DLL

Cách thức gọi DLL trong ứng dụng
2
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 3
Giới thiệu

Liên kết (Linking) là gì ?

Các loại thư viện

Định nghĩa DLL

DLL và cơ chế quản lý bộ nhớ
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 4
Giới thiệu - Liên kết (Linking) là gì ?

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 (Static linking)

Liên kết động (Dynamic linking)
3
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 5
Giới thiệu – Các loại thư viện

Thư viện liên kết tĩnh (Static linking library)

Dạng file: .LIB

Chứa mã lệnh nhị phân của các hàm thư viện

Dùng để nhúng vào file chương trình khi thực hiện giai
đoạ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 hàm thư viện
vào trong những module gọi

Ưu điểm:

Dễ thực hiện

Chương trình có thể chạy độc lập, không cần các file kèm theo

Chương trình sẽ chạy nhanh hơn (nếu kích thước nhỏ)
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 6
Giới thiệu – Các loại thư viện…(tt)

Thư viện liên kết tĩnh (tt)

Khuyết điểm:

Đoạn mã lệnh được nhúng vào file chương trình t
kích thước chương trình lớn, tốn bộ nhớ

Đoạn mã lệnh được nhúng vào nhiều file chương
trình khác nhau t không tối ưu

Khi thay đổi hàm thư viện t phải biên dịch lại toàn bộ
các file chương trình
4
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 7
Giới thiệu – Các loại thư viện…(tt)

Thư viện liên kết động (Dynamic linking library)

Dạng file: .LIB và .DLL

File .Lib:

Thư viện nhập (Import library).

Không chứa mã lệnh của các hàm,

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

File .DLL:

Chứa mã lệnh nhị phân của các hàm thư viện

Được tải vào bộ nhớ khi ứng dụng gọi hàm thư viện

Cần có khi thực hiện ứng dụng

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 dụng

Ứng dụng chỉ cần lưu thông tin của hàm thư viện, và khi
cần, Hệ điều hành sẽ tải các hàm thư viện vào bộ nhớ
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 8
Giới thiệu – Các loại thư viện…(tt)

Thư viện liên kết động (tt)

Ưu điểm:

Kích thước của ứng dụng nhỏ

Nhiều ứng dụng có thể dùng chung 1 DLL, do đó, tiết
kiệm bộ nhớ (thông thường, các ứng dụng có data
riêng, nhưng có thể chia xẻ mã lệnh)

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, chchỉ cần thay thế file DLL, các file
chương trình khác không bịảnh hưởng

Khuyết điểm:

Khó sử dụng hơn
5
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 9
Giới thiệu - Định nghĩa DLL

Là thư viện chứa các hàm và dữ liệu có thể
được gọi từ các module khác (module có thể
là 1 ứng dụng EXE hay là một DLL khác)

DLL được nạp vào bộ nhớ lúc run-time và
được map vào vùng nhớ của tiến trình gọi

DLL có thể chứa 2 loại hàm thư viện:

Export: được phép gọi từ các module khác

Internal: chỉ được dùng nội bộ trong DLL
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 10
Giới thiệu - DLL và cơ chế quản lý bộ nhớ

Mỗi tiến trình (process) sẽ nạp DLL vào
không gian địa chỉảo (virtual address space)
của chính tiến trình đó

Hệ điều hành quản lý 1 biến đếm (Count)
cho mỗi DLL. Biến Count được tăng lên 1
khi DLL được nạp (bởi hàm LoadLibrary);
và bị giảm đi 1 khi được giải phóng (bởi hàm
FreeLibrary)

Khi biến Count=0 hay process kết thúc,
DLL được giải phóng khỏi bộ nhớ
6
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 11
Giới thiệu - DLL và cơ chế quản lý bộ nhớ…(tt)

Các hàm DLL được thực thi trong “ngữ
cảnh” của tiểu trình (Thread) gọi hàm, do đó:

DLL sử dụng Stack của tiểu trình

DLL sử dụng không gian địa chỉảo của tiến
trình gọi

DLL cấp phát bộ nhớ cho những biến động trên
không gian địa chỉảo của tiến trình gọi
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 12
Xây dựng DLL

Xây dựng DLL bằng thư viện Win32 API

Xây dựng DLL bằng thư viện MFC
7
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 13
Xây dựng DLL – D
ùng
thư viện Win32 API

Ví dụ tạo lập DLL

Phân tích các khai báo

Phân tích hàm DllMain

Ví dụ liên kết DLL với 1 ứng dụng
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 14
Xây dựng DLL – D
ùng
thư viện Win32 API…(tt)

Ví dụ tạo lập DLL

Chọn menu File Æ New

Chọn tab Projects

Chọn loại project “Win32 Dynamic Link Library”

Đặt tên project và xác định đường dẫn thư mục
trong ô “Location”

Step 1: Chọn loại ứng dụng “A DLL that exports
some symbols”

Nhấn Finish để kết thúc
8
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 15
Xây dựng DLL – D
ùng
thư viện Win32 API…(tt)

Phân tích các khai báo
<DLL-Name>.h
#define DLLEXPORT __declspec(dllexport)
#define DLLIMPORT __declspec(dllimport)
// Ví dụ khai báo 1 biến “xuất khẩu”
DLLEXPORT int nDll=0;
// Ví dụ khai báo 1 hàm “xuất khẩu”
DLLEXPORT int fnDll(void);

dllexport (xuất khẩu): 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
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 16
Xây dựng DLL – D
ùng
thư viện Win32 API…(tt)

Phân tích các khai báo (tt)

dllimport (nhập khẩu): là load 1 hàm, hay dữ
liệu, hay tài nguyên,… từ 1 DLL khác để sử
dụng

Mỗi DLL có thể Import hàm/dữ liệu từ các DLL
khác; và sẽ Export hàm/dữ liệu của chính nó
<App-Name>.h
#define DLLIMPORT __declspec(dllimport)
// Ví dụ khai báo 1 biến “nhập khẩu”
DLLIMPORT int nDll;
// Ví dụ khai báo 1 hàm “nhập khẩu”
DLLIMPORT int fnDll(void);
9
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 17
Xây dựng DLL – D
ùng
thư viện Win32 API…(tt)

Phân tích hàm DllMain
<DLL-Name>.cpp
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 18
Xây dựng DLL – D
ùng
thư viện Win32 API…(tt)

Phân tích hàm DllMain (tt)

Hàm DllMain là hàm đầu vào chính của DLL

Hàm DllMain được gọi khi DLL được load vào
bộ nhớ hoặc khi Windows yêu cầu DLL kết thúc
(unload khỏi bộ nhớ)

Hàm DllMain có nhiệm vụ khởi tạohoặc giải
phóng các tài nguyên sử dụng cho DLL đó(nếu
có)

Các tham số:

hModule: handle của DLL, do Windows tạo ra

ul_reason_for_call
:
nguyên nhân hàm DllMain
được gọi
10
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 19
Xây dựng DLL – D
ùng
thư viện Win32 API…(tt)

Phân tích hàm DllMain (tt)

DLL_PROCESS_ATTACH:

Hàm DllMain với tham số DLL_PROCESS_ATTACH được gọikhi
process tiến hành load DLL

Thư viện DLL đang được Windows ánh xạ vào vùng nhớ của
tiến trình (thựchiện lời gọi DLL).

Đây là cơ hội để DLL khởi tạo các biến, cấp phát vùng nhớ hay
những 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

DLL_PROCESS_DETATCH:

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 hàm FreeLibrary

Đây là cơ hội để giải phóng các biến hay tài nguyên mà DLL đã
cấp phát
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 20
Xây dựng DLL – D
ùng
thư viện Win32 API…(tt)

Phân tích hàm DllMain (tt)

DLL_THREAD_ATTACH:

Khi tiến trình tạo mới 1 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 đó

Đây là cơ hội để 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ạosau
khi thư viện DLL đã load vào tiến trình, có nghĩa rằng nếu DLL
được load bằng hàm LoadLibrary thì 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

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 đang được sử dụng với tiến trình này

Đây là cơ hội để giải phóng các biến dùng cho tiểu trình
11
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 21
Xây dựng DLL – D
ùng
thư viện Win32 API…(tt)
Ví dụ liên kết DLL với 1 ứng dụng
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 22
Xây dựng DLL – D
ùng
thư viện MFC

Ví dụ tạo lập DLL

Phân tích các khai báo

Định nghĩa hàm export

Các dạng thư viện DLL của MFC
12
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 23
Xây dựng DLL – D
ùng
thư viện MFC…(tt)

Ví dụ tạo lập DLL

Chọn menu File Æ New

Chọn tab Projects

Chọn loại project “MFC AppWizard (dll)”

Đặt tên project và xác định đường dẫn thư mục
trong ô “Location”

Step 1: Chọn loại ứng dụng “Regular DLL using
shared MFC DLL”

Nhấn Finish để kết thúc
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 24
Xây dựng DLL – D
ùng
thư viện MFC…(tt)

Phân tích các khai báo

CMyDllApp: lớp kế thừa từ lớp CWinApp, quản
lý toàn bộ DLL
class CMyDllApp : public CWinApp
{
public:
CMyDllApp();
DECLARE_MESSAGE_MAP()
};
13
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 25
Xây dựng DLL – D
ùng
thư viện MFC…(tt)

Định nghĩa hàm export
<DLL-Name>.cpp
#define DLLEXPORT __declspec(dllexport)
#define DLLIMPORT __declspec(dllimport)
// Ví dụ khai báo 1 hàm “xuất khẩu”
DLLEXPORT int fnDll(void) {
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// Các lệnh của hàm …
….
….
}
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 26
Xây dựng DLL – D
ùng
thư viện MFC…(tt)
Các dạng thư viện DLL của MFC
14
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 27
Xây dựng DLL – D
ùng
thư viện MFC…(tt)

Các dạng thư viện DLL của MFC

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
(overloaded function)

Các ứng dụng Win32 và MFC đều có thể dùng với loại DLL này

“with MFC statically linked”: DLL sẽ được liên kết với các DLL
chuẩn của MFC 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 theo cách liên kết động.

MFC Extention DLL:

Cho phép export các class. Ứng dụng khác có thể tạo các object
từ class, hoặc xây dựng các lớp kế thừa từ class

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
Spring 2004C4W - DLL - Nguyen Tri Tuan - DH.KHTN Tp.HCM 28
Cách thức gọi DLL trong ứng dụng

Cách thức tìm kiếm file DLL

Load-time Dynamic Linking

Run-time Dynamic Linking

Không có nhận xét nào:

Đăng nhận xét