594
Chương 15: Khả năng liên tác mã lệnh không-được-quản-lý
}
Nếu chạy ứng dụng này trên hệ thống Windows XP, bạn sẽ thấy thông tin như sau:
Class size: 148
Major Version: 5
Minor Version: 1
Build Number: 2600
Platform Id: 2
CSD Version: Service Pack 1
Platform: Win32NT
Version: 5.1.2600.0
4.
4.
G i m t hàm không-đ
c-qu n-lý có s d ng callback
ọ ộ
ượ
ả
ử ụ
G i m t hàm không-đ
c-qu n-lý có s d ng callback
ọ ộ
ượ
ả
ử ụ
Bạn cần gọi một hàm không-được-quản-lý và cho phép nó gọi một hàm khác.
Tạo một ủy nhiệm cho callback. Sử dụng ủy nhiệm này khi định nghĩa và sử
dụng hàm không-được-quản-lý.
Nhiều hàm của Win32 API sử dụng callback. Ví dụ, nếu muốn lấy tên của tất cả các cửa sổ
đang mở, bạn có thể sử dụng hàm
EnumWindows
trong thư viện user32.dll . Khi gọi
EnumWindows
, bạn cần truyền cho nó một con trỏ chỉ đến một hàm khác trong mã lệnh của bạn.
Hệ điều hành Windows sau đó sẽ gọi hàm này mỗi khi tìm thấy một cửa sổ đang mở, và truyền
handle của cửa sổ cho nó.
.NET Framework cho phép bạn quản lý việc sử dụng callback mà không cần các con trỏ và
các khối mã không an toàn. Thay vào đó, bạn có thể định nghĩa và sử dụng một ủy nhiệm chỉ
đến hàm callback. Khi bạn truyền ủy nhiệm cho hàm
EnumWindows
, CLR sẽ tự động marshal ủy
nhiệm thành con trỏ hàm không-được-quản-lý như mong muốn.
Ví dụ dưới đây sử dụng
EnumWindows
cùng với một callback để hiển thị tên của tất cả các cửa
sổ đang mở.
using System;
using System.Text;
using System.Runtime.InteropServices;
public class GetWindows {
// Chữ ký cho hàm callback.
public delegate bool CallBack(int hwnd, int lParam);
// Hàm không-được-quản-lý sẽ kích hoạt callback