Lập trình trên môi trường windows

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)

 

 

ppt42 trang | Chia sẻ: Mr Hưng | Lượt xem: 761 | Lượt tải: 0download
Bạn đang xem trước 20 trang nội dung tài liệu Lập trình trên môi trường windows, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
LẬP TRÌNH TRÊN MÔI TRƯỜNG WINDOWS *** Dynamic Link Library & Hook Phạm Minh Tuấnpmtuan@fit.hcmuns.edu.vn*Khoa CNTT - ĐH KHTN*Nội dung trình bàyThư viện liên kết độngHook*Khoa CNTT - ĐH KHTN*Thư viện liên kết động - DLLGiới thiệuXây dựng DLLSử dụng DLL*Khoa CNTT - ĐH KHTN*Thư viện liên kết động - DLLGiớ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ếtLiên kết tĩnh (Static linking)Liên kết động (Dynamic linking)*Khoa CNTT - ĐH KHTN*Thư viện liên kết động - DLLGiới thiệu - Các loại thư việnThư viện liên kết tĩnh (Static linking library)Dạng file: .LIBChứa mã lệnh nhị phân của các hàm thư việnDù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ịchTrì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*Khoa CNTT - ĐH KHTN*Thư viện liên kết động - DLLGiới thiệu - Các loại thư việnThư viện liên kết tĩnh (Static linking library)Ưu điểm:Dễ thực hiệnChương trình có thể chạy độc lập, không cần các file kèm theoChương trình sẽ chạy nhanh hơn (nếu kích thước nhỏ)Khuyết điểm:Đoạn mã lệnh được nhúng vào file chương trình .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=> không tối ưuKhi 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*Khoa CNTT - ĐH KHTN*Thư viện liên kết động - DLLGiới thiệu - Các loại thư việnThư viện liên kết động (Dynamic linking library)Dạng file: .LIB và .DLLFile .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 DLLSử dụng khi dùng cách thức load-time dynamic linkingFile .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ệnCần có khi thực hiện ứng dụngMã 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ớ*Khoa CNTT - ĐH KHTN*Thư viện liên kết động - DLLGiới thiệu - Các loại thư việnThư viện liên kết động (Dynamic linking library)Ưu điểm:Kích thước của ứng dụng 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, chỉ cần thay thế file DLL, các file chương trình khác không bị ảnh hưởngKhuyết điểm:Khó sử dụng hơn*Khoa CNTT - ĐH KHTN*Thư viện liên kết động - DLLGiới thiệu - Định nghĩa DLLLà 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ọiDLL có thể chứa 2 loại hàm thư viện:Export: được phép gọi từ các module khácInternal: chỉ được dùng nội bộ trong DLL*Khoa CNTT - ĐH KHTN*Thư viện liên kết động - DLLGiới thiệuXây dựng DLLSử dụng DLL*Khoa CNTT - ĐH KHTN*Thư viện liên kết động - DLLXây dựng DLLĐể export một hàm thì sử dụng khai báo __declspec(dllexport) hoặc sử dụng DEF fileĐể import một hàm thì sử dụng khai báo __declspec(dllimport)Ví dụKhai báo export một hàm trong DLL __declspec(dllexport) void HoanVi(int & a, int & b) { int t=b; b=a; a=t; }Khai báo sử dụng một hàm từ DLL__declspec(dllimport) void HoanVi(int &a, int&b);*Khoa CNTT - ĐH KHTN*Thư viện liên kết động - DLLGiới thiệuXây dựng DLLSử dụng DLL*Khoa CNTT - ĐH KHTN*Thư viện liên kết động - DLLSử dụng DLLCách thức tìm kiếm file DLLCách thức gọi hàm của DLL trong một ứng dụngLoad-time Dynamic LinkingRun-time Dynamic Linking*Khoa CNTT - ĐH KHTN*Thư viện liên kết động - DLLSử dụng DLLCách thức tìm kiếm file DLLDựa vào giá trị của HKLM\System\CurrentControlSet\Control\ Session Manager\SafeDllSearchMode Nếu SearchMode=1Nơi chứa chương trình ứng dụng gọi DLLThư mục system, system32Thư mục WindowsThư mục hiện hànhCác thư mục được liệt kê trong biến môi trường PATHNếu SearchMode=0Nơi chứa chương trình ứng dụng gọi DLLThư mục hiện hànhThư mục system, system32Thư mục WindowsCác thư mục được liệt kê trong biến môi trường PATH*Khoa CNTT - ĐH KHTN*Thư viện liên kết động - DLLSử dụng DLLCách thức gọi hàm của DLL trong một ứng dụngLoad-time Dynamic LinkingỨng dụng cần liên kết với file thư viện nhập (Import Lib) của DLLỨng dụng sẽ nạp DLL ngay từ ban đầuNếu không tìm ra DLL lúc nạp, ứng dụng sẽ kết thúc ngayCách làm:Add file thư viện nhập (DllName.lib) vào projectKhai báo các hàm IMPORT từ DLLGọi hàm của thư viện DLL như gọi hàm bình thường*Khoa CNTT - ĐH KHTN*Thư viện liên kết động - DLLSử dụng DLLCách thức gọi hàm của DLL trong một ứng dụngRun-time Dynamic LinkingỨng dụng sẽ dùng hàm LoadLibrary hay LoadLibraryEx để nạp DLL tại thời điểm cần thiếtSau khi DLL được nạp, ứng dụng sẽ dùng hàm GetProcAddress để lấy địa chỉ của hàm export trong DLLỨ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 GetProcAddressCách này không cần dùng đến file thư viện nhập (Import Lib)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.*Khoa CNTT - ĐH KHTN*Thư viện liên kết động - DLLSử dụng DLLCách thức gọi hàm của DLL trong một ứng dụngRun-time Dynamic LinkingVí dụtypedef void (*HoanVi)(int & a, int & b)...hinstDLL = LoadLibrary(_T("hook.dll"));proc = (HoanVi)GetProcAddress(hinstDLL, “HoanVi");proc(a,b);*Khoa CNTT - ĐH KHTN*Thư viện liên kết động – Ví dụ minh họaSử dụng win32API*Khoa CNTT - ĐH KHTN*Thư viện liên kết động – Ví dụ minh họaSử dụng win32API*Khoa CNTT - ĐH KHTN*Thư viện liên kết động – Ví dụ minh họaPhân tích hàm DllMainBOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ return TRUE;}*Khoa CNTT - ĐH KHTN*Thư viện liên kết động – Ví dụ minh họaPhân tích hàm DllMain (đầy đủ)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; }*Khoa CNTT - ĐH KHTN*Thư viện liên kết động – Ví dụ minh họaTrong đó: 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 yêu cầu DLL kết thúc (unload khỏi bộ nhớ) 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ác tham số:• hModule: handle của DLL, do Windows tạo ra• ul_reason_for_call: lý do hàm DllMain được gọi*Khoa CNTT - ĐH KHTN*Thư viện liên kết động – Ví dụ minh họaDLL_PROCESS_ATTACH:• Hàm DllMain với tham số DLL_PROCESS_ATTACH được gọi khi 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ự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 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ệnDLL_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 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*Khoa CNTT - ĐH KHTN*Thư viện liên kết động – Ví dụ minh họaDLL_THREAD_ATTACH:• 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 đó.• Đâ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 vào tiến trình, nghĩa là nếu DLL được load bằng hàn 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ể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*Khoa CNTT - ĐH KHTN*Thư viện liên kết động – Ví dụ minh họa__declspec(dllexport) void HoanVi(int & a, int & b){ int t=b; b=a; a=t;}BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ return TRUE;}*Khoa CNTT - ĐH KHTN*Thư viện liên kết động – Ví dụ minh họaSử dụng thư viện MyDLLTạo một ứng dụng để sử dụng thư viện MyDLL (ví dụ: ứng dụng MyAPP) Biên dịch và chạy chương trình:Copy tập tin MyDLL.DLL vào thư mục Debug của “MyAPP”Copy tập tin MyDLL.LIB vào thư mục MyAPPAdd tập tin MyDLL.LIB vào project MyAPP*Khoa CNTT - ĐH KHTN*Thư viện liên kết động – Ví dụ minh họa__declspec(dllimport) void HoanVi(int &a, int&b);void CTmp2Dlg::OnButton1() { int a =2, b=3; HoanVi(a,b); CString s; s.Format("%i %i", a, b); MessageBox(s);}*Khoa CNTT - ĐH KHTN*XÂY DỰNG DLL DÙNG THƯ VIỆN MFC*Khoa CNTT - ĐH KHTN*XÂY DỰNG DLL DÙNG THƯ VIỆN MFC*Khoa CNTT - ĐH KHTN*XÂY DỰNG DLL DÙNG THƯ VIỆN MFCRegular 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ể 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 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 độngMFC Extention DLL:• 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.• 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.*Khoa CNTT - ĐH KHTN*XÂY DỰNG DLL DÙNG THƯ VIỆN MFCXây dựng thư viện MFC Extention DLL MyMFCDLLclass AFX_EXT_CLASS CMyClass {public: void SetFirstName(CString s); void ShowMessageBox(); CMyClass(); virtual ~CMyClass();protected: CString m_FirstName;};*Khoa CNTT - ĐH KHTN*XÂY DỰNG DLL DÙNG THƯ VIỆN MFCCMyClass::CMyClass(){ m_FirstName="MyFirstDLL Sample";}void CMyClass::ShowMessageBox(){ AfxMessageBox(m_FirstName);}void CMyClass::SetFirstName(CString s){ m_FirstName = s;}*Khoa CNTT - ĐH KHTN*XÂY DỰNG DLL DÙNG THƯ VIỆN MFCvoid CMyAPPDlg::OnButton1() { CMyClass my; my.ShowMessageBox();}Trong ứng dụng MyAPP:#include "..\MyMFCDLL\MyClass.h"*Khoa CNTT - ĐH KHTN*CÁCH THỨC GỌI DLL TRONG ỨNG DỤNG – Run-time*Khoa CNTT - ĐH KHTN*Nội dung trình bàyThư viện liên kết độngHook*Khoa CNTT - ĐH KHTN*HookGiới thiệuCơ chế cho phép chặn các sự kiện trước khi chúng được gửi tới hàm xử lý sự kiện tương ứng.*Khoa CNTT - ĐH KHTN*HookGiới thiệuHook sẽ khiến cho hệ thống chậm hơn nên chỉ sử dụng khi cần thiếtVới mỗi loại hook hệ thống sẽ duy trì một dãy các hook procedure tương ứng(hook chain)Hook procedure có thể giám sát, hiệu chỉnh thông điệp hoặc ngăn cản việc chuyển thông điệp đến nơi tương ứng LRESULT CALLBACK HookProc( int nCode, WPARAM wParam, LPARAM lParam ) { } *Khoa CNTT - ĐH KHTN*HookGiới thiệuGlobal hook cho phép chặn thông điệp của tất cả các tiến trìnhHook procedure phải đặt trong một DLL nào đóThread-specific hook chỉ cho phép chặn thông điệp của một tiến trình cụ thểNếu chương trình chặn thông điệp của chính nó thì hook procedure có thể thuộc chương trình đóNếu chương trình chặn thông điệp của tiến trình khác thì hook procedure phải đặt trong một DLL nào đó *Khoa CNTT - ĐH KHTN*HookCác loại hookWH_CALLWNDPROC WH_CALLWNDPROCRETWH_CBTWH_DEBUGWH_FOREGROUNDIDLEWH_GETMESSAGEWH_JOURNALPLAYBACKWH_JOURNALRECORD WH_KEYBOARD_LLWH_KEYBOARD WH_MOUSE_LLWH_MOUSEWH_MSGFILTER WH_SYSMSGFILTERWH_SHELL*Khoa CNTT - ĐH KHTN*HookCài đặt Hook procedureSử dụng hàm SetWindowsHookExGỡ bỏ Hook procedureSử dụng hàm UnhookWindowsHookEx*Khoa CNTT - ĐH KHTN*HookDemo Keyboard HookKeyboard Hook procedure được gọi khi ứng dụng gọi GetMessage hay PeekMessage và có một sự kiện bàn phím để xử lýnCode: HC_ACTION: wParam và lParam chứa thông tin về sự kiện bàn phímHC_NOREMOVE: wParam và lParam chứa thông tin về sự kiện bàn phím nhưng thông điệp vẫn còn nằm trong hàng đợiwParam: virtual-key code của phímlParam: 0-15 repeat count 16-23 scan code 24 25-28 29 30 31 extended key ALT key previous key state transition state *Khoa CNTT - ĐH KHTN*

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

  • pptlap_trinh_window_chuong6_3287.ppt
Tài liệu liên quan