Thứ Năm, 08/01/2004 15:37 (GMT+7)
|
|
|
|
|
|
Câu hỏi :
Hỏi: Xin hướng dẫn cách sử dụng hàm Windows API SetWindowsHookEx để câu móc hàm hệ thống, ví dụ như GetWindowsDirectory, để mỗi khi ứng dụng nào đó dùng hàm này thì ứng dụng của tôi sẽ chặn trước nó và thực hiện một việc nào đó. Việc câu móc này có kết thúc tự động cùng với ứng dụng của tôi không?
Trả lời :
Đáp: Hook (câu móc) là phương tiện mà Windows cho phép người lập trình câu móc 1 hàm do họ viết vào Windows để xử lý 1 sự kiện nào đó. Nhờ hook mà người lập trình có thể thay đổi hành vi của Windows ở một mức độ nhất định, tuy nhiên Windows không cung cấp khả năng hook vào hàm API bất kỳ (hook WH_CALLWNDPROC chỉ chặn được việc gọi hàm SendMessage), do đó bạn không thể dùng kỹ thuật "hook" để thay đổi chức năng của hàm API GetWindowsDirectory() như bạn yêu cầu. Tuy nhiên bạn có thể dùng kỹ thuật "override" để hiệu chỉnh lại chức năng của bất kỳ hàm API nào của Windows, chỉ có điều Microsoft không trình bày kỹ thuật override này, hơn nữa có nhiều cách khác nhau để override hàm API và mỗi cách thường chỉ chạy tốt trên từng môi trường Windows cụ thể (Win16 hay Win32). Lưu ý rằng sau khi override 1 hàm API nào đó, nếu muốn trả hàm về trạng thái ban đầu, bạn cần thực hiện tác vụ "un-override" 1 cách tường minh. Do khuôn khổ phần trả lời thư rất hạn chế, chúng tôi không tiện trình bày chi tiết qui trình override 1 hàm API trong môi trường Win16 và Win32, chúng tôi sẽ viết bài riêng để giới thiệu qui trình override này cùng thí dụ cụ thể.