Các kỹ thuật tương tác với mã khơng quản lý

Một phần của tài liệu phần mềm hỗ trợ người khiếm thị học tiếng anh (Trang 122)

4 NHỮNG KỸ THUẬT SỬ DỤNG TRONG ỨNG DỤNG

4.1 Các kỹ thuật tương tác với mã khơng quản lý

Do chương trình cần tương tác các hàm API cấp thấp, do đĩ ta cần một chếđể thực hiện việc triệu gọi này. Để sử dụng một hàm từ DLL với mã khơng được quản lý, ta chỉ

cần khai báo một cách thích hợp. CLR sẽ tựđộng đảm trách phần việc cịn lại, bao gồm việc tải DLL vào bộ nhớ khi hàm được gọi và chuyển các thơng số từ kiểu dữ liệu .NET thành kiểu dữ liệu tương ứng. .NET hỗ trợ việc thực thi xuyên-nền này cĩ tên là PInvoke (Platform Invoke), và quá trình này thường là trong suốt đối với người sử dụng.

PInvoke thường được sử dụng để truy xuất các hàm Win32 API, đặc biệt là các tính năng khơng cĩ trong các lớp được-quản-lý thuộc .NET Framework. Các thư viện thường dùng:

• Oleacc.dll : gồm các hàm dùng trong Microsoft Active Accessibility.

• kernel32.dll : gồm các hàm đặc-trưng-hệ-điều-hành như nạp tiến trình, chuyển ngữ cảnh, nhập/xuất file và bộ nhớ.

Trang 123

• user32.dll : gồm các hàm dùng để thao tác cửa sổ, trình đơn, hộp thoại, biểu tượng,…

• gdi32.dll : gồm các hàm đồ họa dùng đểđể vẽ trực tiếp lên cửa sổ, trình đơn, cũng nhưđể in ấn.

Cơ chế này được .Net hỗ trợ thơng qua việc áp dụng đặc tính DllImportAttribute trong namespace System.Runtime.InteropServices để chỉđịnh file DLL và tên của hàm cần dùng.

Code minh ha:

[DllImport("user32.dll")]

public static extern IntPtr GetForegroundWindow();

4.1.2 Khai báo d liu dùng cho mã khơng qun lý

Mặc định CLR điều khiển việc bố trí vật lý các trường dữ liệu của một cấu trúc hay lớp trong bộ nhớ quản lý. Chỉ định trước việc bố trí các trường dữ liệu là một điều quan trọng nếu cấu trúc hoặc lớp đĩ được chuyển qua mã khơng quản lý mà cần tới một sự bố trí

đặc biệt nào đĩ. Đểđiều khiển việc bố trí vật lý các trường dữ liệu của cấu trúc hoặc lớp chúng ta sử dụng đặc tính StructLayoutAttribute trong namespace

System.Runtime.InteropServices.

Code minh ha :

[StructLayout(LayoutKind.Explicit)]

public struct Rect {

[FieldOffset(0)]

public int left; [FieldOffset(4)]

public int top; [FieldOffset(8)]

public int right; [FieldOffset(12)]

public int bottom; }

Kiểu liệt kê LayoutKind sẽ xác định việc điều khiển cách bố trí của một đối tượng khi kết xuất qua mã khơng quản lý.

Trang 124

Các giá tr :

• Auto : Các trường dữ liệu của một đối tượng sẽđược chọn một cách bố trí phù hợp trong bộ nhớ khơng quản lý vào lúc chạy.

• Explicit : Vị trí chính xác mỗi trường dữ liệu của một đối tượng trong phải

được định trước trong bộ nhớ khơng quản lý.

• Sequential : Các trường dữ liệu của đối tượng đã được bố trí một cách tuần tự

theo thứ tự chúng được khai báo khi kết xuất sang bộ nhớ khơng quản lý.

Một phần của tài liệu phần mềm hỗ trợ người khiếm thị học tiếng anh (Trang 122)