Saturday, October 31, 2009

WINDOWS API 1 - Bản chất của Windows API

Trong lập trình Visual Basic độc lập hoặc Visual Basic for Application, Microsoft đã cung cấp cho chúng ta một bộ các hàm lập sẵn, hàng trăm hàm API (Aplication Programming Interface) được lưu trong các tệp thư viện liên kết động (Tệp đuôi *.DLL - Dynamic Link Library). Đó là công cụ tuyệt vời cho phép bạn phát triển ứng dụng cực mạnh, tại sao bạn lại bỏ qua và không sử dụng nó?

Tôi sẽ cùng bạn khám phá những gì mà Microsoft cung cấp các hàm Windows API trong bộ Visual Studio. Tuy nhiên vì khuôn khổ cũng như kích thước của bài viết, ta chỉ đi vào các nét chính căn bản nhất, bạn có thể tham khảo trong Help hoặc các bài viết của Nguyễn Hồ Thiên Đăng, Nguyễn Thị Thanh Phương tại WebsiteLH.

I. Hàm API - Nhìn từ góc độ người ít có điều kiện học Tin học

Nếu bạn chưa từng lập trình những chương trình lớn, bạn sẽ phát hoảng khi đọc khai báo (rắc rối và kỳ cục!!!) của API:

Private Declare Function CallNextHookEx Lib "user32" Alias "CallNextHookEx" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long

Tuy nhiên bạn có thể chép phần khai báo trên thật đơn giản bằng Text API Viewer. Theo các chuyên gia về Tin học thì đừng bao giờ sử dụng thẳng hàm API trong thủ tục thiết kế chính của mình. Thay vào đó ta thiết kế một hàm hay thủ tục Visual Basic thay thế hàm API để đơn giản hoá (Gọi là wrapper - Tôi không tìm được từ tiếng Việt tương ứng để nói đủ bản chất của nó.)

Ví dụ một wrapper sau:
Public Sub ThoatVaTatMay ()
'Thoát và tắt máy
Dim thoat
Thoat = ExitWindowsEX(2,0)
End Sub

Khi đó, trong chương trình Visual Basic của ta khi cần thoát và tắt máy chỉ việc gọi:
ThoatVaTatMay
hoặc Call ThoatVaTatMay
Là máy tính thực hiện thoát và tắt máy.

Chính vì thế, khi học viên dân tộc được học phổ cập API tại Trung tâm Dạy nghề và Phổ cập Tin học Miền núi ABC của chúng tôi đã gọi chức năng tạo Wrapper chẳng khác dán nhãn Tiếng Việt cho từng loại thuốc tây API vậy. Nên khi lập trình ta nên tạo các Wrapper tương ứng với các chức năng mà mình muốn sử dụng. Đó cũng là lời khuyên của Bill Gate cho chúng ta.

Để tạo các wrapper bạn hãy chèn một Module vào Project. Nếu máy của bạn không cài Visual Basic thì bạn phải copy hay đánh thật chính xác những dòng khai báo dạng như khai báo trên, thật khổ sở nếu như phần tiếng Anh của bạn không thạo lắm, vì một sai sót nhỏ có thể dẫn tới lỗi nặng cho máy. Nếu máy có cài Visual Basic thì quá tốt, chỉ việc khởi động API Viewer để hiện bảng giao tiếp như thế này:

Bạn phải mở các tệp TXT trong thư mục API của thư mục cài Visual Basic trong máy bạn. Ví dụ tệp Win32api.TXT. Máy sẽ hỏi có chuyển thành dạng cơ sở dữ liệu không, thì hãy chọn có để sử dụng API thuận lợi và nhanh chóng hơn. Khi đã copy vào clipboard, bạn có thể dán vào module của mình. Nó sẽ thành dạng tương tự như thế này:

Declare Function CallNextHookEx Lib "user32" Alias "CallNextHookEx" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long

Bạn phải đánh thêm vào trước khai báo trên cụm từ Private để được:
Private Declare Function CallNextHookEx Lib "user32" Alias "CallNextHookEx" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long

Tôi xin phép được nhắc lại 2 từ khoá khai báo trong Visual Basic là Private và Public.

Private - Khai báo dùng riêng trong Module. Có nghĩa là bạn chỉ sử dụng được nó trong Module này. Nếu chèn Module khác sẽ không sử dụng được nó.

Public - Khai báo dùng chung, bạn có thể dùng nó ở bất cứ Module nào.

Bạn biết đấy, ta khai báo các hàm API thì lại dùng Private, còn khai báo các Wrapper lại dùng Public. Đó chính là mẹo mà chúng ta đã học trộm được của Microsoft để tránh lỗi hệ thống.

Các hàm mà ta thiết kế trong Visual Basic có điều khác với các hàm API. Tại sao? Vì hàm ta thiết kế (Tạm gọi là hàm Visual Basic) thường chỉ có một kết quả trả về của hàm làm căn cứ xử lý. Còn hàm API không phải chỉ có một kết quả trả về mà nó còn trả về tiếp các giá trị vào các biến mà ta truyền cho nó. Nghĩa là có gọi nó là hàm thì bản chất nó là một thủ tục, ta gọi hàm để thực hiện và kiểm tra xem thủ tục trong hàm đó có thực hiện được thành công hay không mà thôi.

Điều này chỉ hơi giống như khi bạn lập trình với hàm Visual Basic mà bạn khai báo Public Static - Biến tĩnh dùng chung, để làm biến đổi nó trong hàm của bạn. Ta nghiên cứu một cách tổng quát như sau để hiểu cặn kẽ:

Giả sử ở một Wrapper bạn dùng công thức:
TENBIEN=TEN_HAM_API(Bien1, Bien2, Bien3)

Thực ra đây là một thủ tục. Nếu TENBIEN<>0 thì thủ tục này thành công.

Khi đó các Bien1, Bien2, Bien3 truyền vào, sẽ có một giá trị mới. Lập trình API lúc này không chỉ xử lý TENBIEN, mà bạn có thể xử lý các Bien1, Bien2, Bien3. Đó mới thực sự là sức mạnh của API.

Bản chất lập trình của biến là một vùng các ô nhớ trong RAM được đặt tên để tiện sử dụng. Tại một thời điểm biến chỉ có một giá trị duy nhất. Người ta có thể dùng biến này làm giá trị định vị hoặc kích thước lưu trữ cho biến kia. Các hàm API có thể được gọi nhiều lần để sử dụng kết quả trả về của các biến truyền Bien1, Bien2, Bien3 để xử lý theo quy luật xác định nào đó.

II. Xác định mục đích khi sử dụng WinAPI.

Trong lập trình API có thể phân làm nhiều mục đích sử dụng, tôi chưa từng được học Tin học một cách chính thống, nên có thể khả năng phân tích và tổng hợp những bài viết trên INTERNET của Microsoft khác với những bài học của những học viên học Tin học chính quy. Nhưng tôi nghĩ chúng ta nắm bản chất của vấn đề mới là điều quan trọng.

Có 3 vấn đề chính khi sử dụng và khai thác WinAPI đó là:

a. Kỹ thuật Subclass: Để cải tổ các đối tượng Visual Basic.
b. Kỹ thuật Hook: Câu móc từ chương trình Visual Basic với các chương trình khác. Lấy giá trị nhập vào các chương trình khác của người sử dụng đưa vào chương trình của mình để xử lý.
c. Kỹ thuật Multicasting: Dùng một đối tượng tạo lập để theo dõi, chi phối các đối tượng khác của Visual Basic.

Bạn có thể sử dụng từng Kỹ thuật hoặc cả 3. Tuy nhiên bước đầu chưa thạo, bạn hãy thực hiện từng Kỹ thuật một cho thành thạo. Sau khi kiểm soát được khả năng của mình, bạn sẽ đủ trình độ để sử dụng WinAPI để cải tổ Windows và máy tính.

No comments:

Post a Comment