Danh mục

Khả năng liên tác và mã lệnh không được quản lý Microsoft .NET phần cuối

Số trang: 12      Loại file: pdf      Dung lượng: 201.70 KB      Lượt xem: 17      Lượt tải: 0    
Hoai.2512

Hỗ trợ phí lưu trữ khi tải xuống: 3,000 VND Tải xuống file đầy đủ (12 trang) 0

Báo xấu

Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

(Bỏ qua lớp OSVersionInfo.) [DllImport("kernel32.dll")] public static extern bool GetVersionEx([In, Out] OSVersionInfo osvi); private static void Main()
Nội dung trích xuất từ tài liệu:
Khả năng liên tác và mã lệnh không được quản lý Microsoft .NET phần cuốiusing System;using System.Runtime.InteropServices;public class CallWithStructure { // (Bỏ qua lớp OSVersionInfo.) [DllImport(kernel32.dll)] public static extern bool GetVersionEx([In, Out] OSVersionInfo osvi); private static void Main() { OSVersionInfo osvi = new OSVersionInfo(); osvi.dwOSVersionInfoSize = Marshal.SizeOf(osvi); GetVersionEx(osvi); Console.WriteLine(Class size: + osvi.dwOSVersionInfoSize); Console.WriteLine(Major Version: + osvi.dwMajorVersion); Console.WriteLine(Minor Version: + osvi.dwMinorVersion); Console.WriteLine(Build Number: + osvi.dwBuildNumber); Console.WriteLine(Platform Id: + osvi.dwPlatformId); Console.WriteLine(CSD Version: + osvi.szCSDVersion); Console.WriteLine(Platform: + Environment.OSVersion.Platform); Console.WriteLine( Version: + Environment.OSVersion.Version); Console.ReadLine(); }}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: 148Major Version: 5Minor Version: 1Build Number: 2600Platform Id: 2CSD Version: Service Pack 1Platform: Win32NTVersion: 5.1.2600.0 1.1 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ửasổ đang mở, bạn có thể sử dụng hàm EnumWindows trong thư viện user32.dll . Khi gọiEnumWindows, bạn cần truyền cho nó một con trỏ chỉ đến một hàm khác trong mã lệnhcủ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ổ đangmở, 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 ủynhiệ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 // khi duyệt qua các cửa sổ đang mở. [DllImport(user32.dll)] public static extern int EnumWindows(CallBack callback, int param); [DllImport(user32.dll)] public static extern int GetWindowText(int hWnd, StringBuilder lpString, int nMaxCount); private static void Main() { CallBack callBack = new CallBack(DisplayWindowInfo); // Yêu cầu hệ điều hành duyệt qua các cửa sổ đang mở, // kích hoạt callback với handle của mỗi cửa sổ. EnumWindows(callBack, 0); Console.ReadLine(); } // Hàm sẽ nhận callback. Thông số thứ hai // không được sử dụng nhưng phải được khai báo để // tương thích với chữ ký của callback. public static bool DisplayWindowInfo(int hWnd, int lParam) { int chars = 100; StringBuilder buf = new StringBuilder(chars); if (GetWindowText(hWnd, buf, chars) != 0) { Console.WriteLine(buf); } return true; }} 1.2 Lấy thông tin lỗi không-được-quản-lý Bạn cần truy xuất thông tin lỗi (mã lỗi hoặc thông điệp mô tả lỗi) giải thích tại sao một lời gọi Win32 API thất bại. Trong phần khai báo của hàm không-được-quản-lý, thiết lập trường SetLastError của đặc tính DllImportAttribute là true. Nếu có lỗi khi thực thi, gọi phương thức tĩnh Marshal.GetLastWin32Error để truy xuất mã lỗi. Để lấy thông điệp mô tả một mã lỗi cụ thể, sử dụng hàm không-được-quản-lý FormatMessage.Bạn không thể trực tiếp lấy thông tin lỗi bằng hàm không-được-quản-lý GetLastError.Vấn đề là, mã lỗi do GetLastError trả về có thể không phản ánh lỗi do hàm không-được-quản-lý gây ra. Thay vào đó, nó có thể được thiết lập bởi các lớp .NET Framework kháchoặc CLR. Bạn có thể lấy thông tin lỗi một cách an toàn bằng phương thức tĩnhMarshal.GetLastWin32Error. Phương thức này cần được gọi ngay sau lời gọi hàm không-được-quản-lý, và nó sẽ trả về thông tin lỗi chỉ một lần (các lần gọi GetLastWin32Errorsau đó sẽ trả về mã lỗi 127). Ngoài ra, bạn phải thiết lập trường SetLastError của đặc tínhDllImportAttribute là true, cho biết những lỗi do hàm này sinh ra sẽ được ghi nhận.[DllImport(user32.dll, SetLastError=true)]Sau đó, bạn có thể sử dụng hàm FormatMessage trong thư viện kernel32.dll để lấy thôngđiệp mô tả lỗi từ mã lỗi Win32.Ví dụ, ứng dụng dưới đây muốn hiển thị một MessageBox, nhưng lại sử d ...

Tài liệu được xem nhiều: