2009-04-19 36 views

Trả lời

0

Sẽ không có ý nghĩa gì khi gọi hàm đó từ mã được quản lý. Nó có ý nghĩa trong mã không được quản lý bởi vì bạn biết chính xác hàm Win32 cuối cùng đã được gọi, vì vậy bạn biết hàm nào phải thiết lập lỗi cuối cùng. Trong mã được quản lý, bạn không biết chức năng nào đã được gọi.

Bạn có thể sử dụng P/Gọi để gọi hàm; nó sẽ không làm bạn tốt. Bạn đang cố gắng để thực hiện?

7

WSAGetLastError chỉ là trình bao bọc cho hàm Win32 GetLastError.

Nếu bạn đang làm việc với P/Invoke, bạn có thể sử dụng tham số SetLastError cho thuộc tính DllImport. Nó nói với .NET rằng hàm được nhập sẽ gọi SetLastError() và giá trị đó sẽ được thu thập.

Nếu chức năng được nhập không thành công, bạn có thể gặp lỗi cuối cùng với Marshal.GetLastWin32Error(). Ngoài ra, bạn chỉ có thể throw new Win32Exception(), sử dụng giá trị này tự động.

Nếu bạn không làm việc với P/Invoke, bạn đã hết may mắn: không đảm bảo rằng giá trị lỗi cuối cùng sẽ được giữ nguyên đủ lâu để làm cho nó trở lại qua nhiều lớp mã .NET. Trong thực tế, tôi sẽ liên kết với Adam Nathan: never define a PInvoke signature for GetLastError.

-2

Đây là cách tôi nhìn thấy trên web để đặt GetLastError vào C# ngoại lệ mechanismand làm thế nào để có được nó lại ra một lần nữa ...

try 
{ 
    // some p/invoke call that is going to fail with a windows error ... 
    mHndActivatedDevice = MyNameSpace.Interop.Device.Device.ActivateDevice(
     "Drivers\\BuiltIn\\SomeDriverName", IntPtr.Zero, 0, IntPtr.Zero); 
} 
catch(System.ComponentModel.Win32Exception exc) // as suggested by John Saunders 
{ 
    // you can get the last error like this: 
    int lastError = System.Runtime.InteropServices.Marshal.GetLastWin32Error(); 
    Console.WriteLine("error:" + lastError.ToString()); 

    // but it is also inside the exception, you can get it like this 
    Console.WriteLine(exc.NativeErrorCode.ToString()); 

    Console.WriteLine(exc.ToString()); 
} 

nơi ActivateDevice được định nghĩa như sau:

+1

-1: Mã nên bắt Win32Exception, không ngoại lệ. Nếu không, có một cơ hội của một số loại ngoại lệ khác bị bắt, sau đó trường hợp để Win32Exception thất bại. –

Các vấn đề liên quan