CÁC GIẢI PHÁP LẬP TRÌNH C# - Trang 596

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

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));

Liên Kết Chia Sẽ

** Đây là liên kết chia sẻ bới cộng đồng người dùng, chúng tôi không chịu trách nhiệm gì về nội dung của các thông tin này. Nếu có liên kết nào không phù hợp xin hãy báo cho admin.