596
Chương 15: Khả năng liên tác mã lệnh không-được-quản-lý
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ác hoặ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ĩnh
Marshal.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
GetLastWin32Error
sau đó 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ính
DllImportAttribute
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ụng handle không
đúng. Mã lỗi được lấy bằng
Marshal.GetLastWin32Error
, và thông điệp mô tả lỗi được lấy
bằng
FormatMessage
.
using System;
using System.Runtime.InteropServices;
public class TestError {
[DllImport("kernel32.dll")]
private unsafe static extern int FormatMessage(int dwFlags,
int lpSource, int dwMessageId, int dwLanguageId,
ref String lpBuffer, int nSize, int Arguments);
[DllImport("user32.dll", SetLastError=true)]
public static extern int MessageBox(int hWnd, string pText,
string pCaption, int uType);
private static void Main() {
int badWindowHandle = 453;
MessageBox(badWindowHandle, "Message", "Caption", 0);
int errorCode = Marshal.GetLastWin32Error();
Console.WriteLine(errorCode);
Console.WriteLine(GetErrorMessage(errorCode));