DLL cua Windows
8.3.2 Các DLL của Windows
Các API được tổ chức trong bốn DLL chính của Windows:
a. KERNEL32:
Là DLL chính, đảm nhiệm quản lý bộ nhớ, thưc hiện chức năng đa nhiệm và những hàm ảnh hưởng trực tiếp đến hoạt động của Windows.
b. USER32:
Thư viện quản lý Windows. Thư viện này chứa các hàm xử lý menu, định giờ, truyền tin, tập tin và nhiều phần không được hiển thị khác của Windows.
c. GDI32:
Giao diện thiết bị đồ hoạ (Graphics Device Interface). Thư viện này cung cấp các hàm vẽ trên màn hình, cũng như kiểm tra phần biểu mẫu nào cần vẽ lại.
d. WINNM:
Cung cấp các hàm multimedia để xử lý âm thanh, nhạc, video thờI gian thực, lấy mẫu, v.v... Nó là DLL 32 bit. (Thư viện 16 bit tên là MMSYSTEM)
Ta có thể tìm các tập tin này trong thư mục \Windows\system. Ngoài ra, còn có các DLL nhỏ hơn, cũng được dùng phổ biến để cung cấp các dịch vụ đặc biệt cho ứng dụng.
Trên đây là các tên DLL 32 bit. Phiên bản VB4 là bản cuốI cùng còn hỗ trợ 16 bit.
8.3.3 Gọi API
Gọi API không khác gì với gọi hàm/ thủ tục trong module của đề án. Ví dụ ta có thủ tục:
Public sub FindText(obiDataControl as Control, _
SFilename as String)
' Code to implement function here
End sub
Để gọI thủ tục ta dùng :
FindText datTitles, "Titles"
Chỉ có điều API là một thủ tục không chỉ nằm ngoài module mà còn nằm ngoài Visual Basic.
8.3.3.1 Khai báo một cuộc gọI API:
Trước khi dùng hàm của DLL, ta cần khai báo hàm đó. Visual Basic cần biết:
- Tên hàm / thủ tục.
- Tập tin DLL chứa nó.
- Tham số truyền.
- Kiểu dữ liệu truyền về nếu là hàm.
Khai báo API tương tự khai báo hằng/ thủ tục thông thường. Ta vẫn bắt đầu bằng từ khoá Sub/Function, chỉ khác là trước đó phảI có từ khoá Declare.
Ví dụ mẫu - Tạo cửa sổ nhấp nháy bằng cách gọI API
1. Tạo đề án chuẩn mớI
2. Vẽ điều khiển định giờ (timer) trên biểu mẫu và định thuộc tính
Interval là 10. Nó sẽ gây ra một sự kiện timer mỗI 10 mi-li-giây.
Hình 9.2 Biểu tượng điều khiển Timer trên hộp công cụ.
3. Nhấn đúp lên cửa sổ này để mở Cửa sổ Code
Private Sub Timer1_Timer()
Dim nReturnValue As Integer
nReturnValue = Flash(Form1.hWnd, True)
End Sub
4. Khai báo hàm Flash trong General Declarations:
Private Declare Function Flash Lib "User32" _
Alias "FlashWindow" _
(ByVal hWnd As Long, _
ByVal bInvert As Long) As Long
5. Thi hành chương trình. Khi biểu mẫu xuất hiện, tiêu đề của nó nhấp nháy.
Mặc dù ta thấy chương trình này rất đơn giản, nhưng nếu viết bằng các hàm Visual Basic thông thường, nó rất phức tạp và tốn rất nhiều chương trình.
Từ khoá Declare báo VB biết đây là khai báo một hàm của DLL.
Sau Declare là từ khoá Sub hay Function, cho biết đây là thủ tục hay hàm. Ta chỉ có một trong hai lựa chọn.
Từ khoá Lib cho biết tên DLL đang chứa hàm/ thủ tục đó. Ở đây là thư viện User32. Từ khoá Alias cho biết tên thực sự của thủ tục / hàm trong thư viện. Nó có thể khác vớI tên ta khai báo trước từ khoá Lib.
CuốI cùng là khai báo các tham sổ truyền, cùng vớI kiểu dữ liệu hàm trả về.
Ở đây tham số được truyền là :
(ByVal hWnd As Long, ByVal bInvert As Long) As Long
Tham số đầu, hWnd, là "handle", xác định cửa sổ cần nhấp nháy. Tham số thứ hai, bInvert là giá trị Boolean. Nếu bInvert được truyền vào có giá trị True, thanh tiêu đề sẽ nhấp nháy. Để trả về trạng thái đầu, ta phảI gọI lạI lần nữa, vớI bInvert mang giá trị False.
VớI nhiều hàm API, tên Alias trùng vớI tên thực. Khi đó Visual Basic sẽ tự động loạI bỏ phần Alias. Ví dụ:
Private Declare Function FlashWindow Lib "User32" _
Alias "FlashWindow" _
(ByVal hWnd As Long, _
ByVal bInvert As Long) As Long
Visual Basic sẽ đổI thành:
Private Declare Function FlashWindow Lib "User32" _
(ByVal hWnd As Long, _
ByVal bInvert As Long) As Long
Tuy nhiên một số có tên không hợp lệ đốI vớI Visual Basic, như _lopen, một số khác có nhiều phiên bản, ví dụ có ký tự A và W ở cuốI tên. Nói chung, tốt nhất nên dùng tên thực của API. Một số lập trình viên dùng Alias để thay thế tên hàm, hoặc thậm chí khai báo hai tên cho hai phiên bản hàm để nhận các tham số truyền khác nhau.
nReturnValue = Flash(Form1.hWnd, True)
Sau khi khai báo hàm API, ta có thể gọI API như một hàm hoặc thủ tục Visual Basic thông thường. GọI Flash là gọI đến API trong DLL, và ta lưu giá trị trả về trong biến nReturnValue.
ĐốI vớI các hàm thông thường, ta có thể không cần sử dụng giá trị trả về của hàm. Tuy nhiên, ta vẫn cần chứa giá trị trả về vào một biến dù ta không có ý định sử dụng nó. Phần lớn API trả về mã lỗI kiểu số, và ta có thể dùng nó để kiểm tra mọI việc có hoạt động chính xác hay không.
Trong thực tế, bỏ qua giá trị trả về không chỉ là lườI biếng mà còn thực sự nguy hiểm nếu ta đang gọI nhiều API.
Sử dụng API sai có thể dẫn đến treo Windows, nếu không nói là treo máy. Khi làm việc vớI các API phức tạp, như những hàm cần cấp phát nhiều vùng nhớ và tài nguyên hệ thống. Không nên bắt chiếc các lập trình viên cẩu thả bỏ qua các giá trị trả về. Vì hàm DLL nằm ngoài ứng dụng, chúng tự kiểm tra lỗi - ta chỉ biết có sai sót thông qua giá trị trả về.
Bạn đang đọc truyện trên: Truyen247.Pro