Marshal.GetLastWin32Error Method

Definition

返回由上一个非托管函数返回的错误代码,该函数是使用设置了 SetLastError 标志的平台调用来的。Returns the error code returned by the last unmanaged function that was called using platform invoke that has the SetLastError flag set.

public:
 static int GetLastWin32Error();
[System.Security.SecurityCritical]
public static int GetLastWin32Error ();
public static int GetLastWin32Error ();
static member GetLastWin32Error : unit -> int
Public Shared Function GetLastWin32Error () As Integer

Returns

Int32

通过调用 Win32 SetLastError 函数设置的最后一个错误代码。The last error code set by a call to the Win32 SetLastError function.

Attributes

Examples

下面的示例调用 GetLastWin32Error 方法。The following example calls the GetLastWin32Error method. 该示例首先演示如何调用方法,但不会出现错误,然后说明调用方法时出现错误。The example first demonstrates calling the method with no error present and then demonstrates calling the method with an error present.

using System;
using System.Runtime.InteropServices;

internal class Win32
{
    // Use DllImportAttribute to inport the Win32 MessageBox
    // function.  Set the SetLastError flag to true to allow
    // the function to set the Win32 error.
    [DllImportAttribute("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern int MessageBox(IntPtr hwnd, String text, String caption, uint type);
}

class Program
{

    static void Run()
    {
        // Call the MessageBox with normal parameters.

        Console.WriteLine("Calling Win32 MessageBox without error...");

        Win32.MessageBox(new IntPtr(0), "Press OK...", "Press OK Dialog", 0);

        // Get the last error and display it.
        int error = Marshal.GetLastWin32Error();

        Console.WriteLine("The last Win32 Error was: " + error);

        // Call the MessageBox with an invalid window handle to
        // produce a Win32 error.

        Console.WriteLine("Calling Win32 MessageBox with error...");

        Win32.MessageBox(new IntPtr(123132), "Press OK...", "Press OK Dialog", 0);

        // Get the last error and display it.

        error = Marshal.GetLastWin32Error();

        Console.WriteLine("The last Win32 Error was: " + error);
    }

    static void Main(string[] args)
    {
        Run();
    }
}
// This code example displays the following to the console:
//
// Calling Win32 MessageBox without error...
// The last Win32 Error was: 0
// Calling Win32 MessageBox with error...
// The last Win32 Error was: 1400
Imports System.Runtime.InteropServices

Module Win32
    ' Use DllImportAttribute to inport the Win32 MessageBox
    ' function.  Set the SetLastError flag to true to allow
    ' the function to set the Win32 error.
    <DllImportAttribute("user32.dll", SetLastError:=True, CharSet:=CharSet.Unicode)> _
    Function MessageBox(ByVal hwnd As IntPtr, ByVal text As String, ByVal caption As String, ByVal type As UInt32) As Integer
    End Function

End Module

Module Program


    Sub Run()


        ' Call the MessageBox with normal parameters.

        Console.WriteLine("Calling Win32 MessageBox without error...")

        Win32.MessageBox(New IntPtr(0), "Press OK...", "Press OK Dialog", 0)

        ' Get the last error and display it.
        Dim errorVal As Integer

        errorVal = Marshal.GetLastWin32Error()

        Console.WriteLine("The last Win32 Error was: " + errorVal)

        ' Call the MessageBox with an invalid window handle to
        ' produce a Win32 error.

        Console.WriteLine("Calling Win32 MessageBox with error...")

        Win32.MessageBox(New IntPtr(123132), "Press OK...", "Press OK Dialog", 0)

        ' Get the last error and display it.

        errorVal = Marshal.GetLastWin32Error()

        Console.WriteLine("The last Win32 Error was: " + errorVal)

    End Sub

    Sub Main(ByVal args() As String)

        Run()

    End Sub

End Module

' This code example displays the following to the console: 
'
' Calling Win32 MessageBox without error...
' The last Win32 Error was: 0
' Calling Win32 MessageBox with error...
' The last Win32 Error was: 1400

Remarks

在 Windows 系统中,GetLastWin32Error 从 Kernel32.dll 公开 Win32 GetLastError函数。On Windows systems, GetLastWin32Error exposes the Win32 GetLastError function from Kernel32.DLL. 此方法存在的原因是,对 GetLastError 进行直接平台调用以获取此信息是不可靠的。This method exists because it is not reliable to make a direct platform invoke call to GetLastError to obtain this information. 如果要访问此错误代码,则必须调用 GetLastWin32Error,而不是编写自己的 GetLastError 的平台调用定义并调用它。If you want to access this error code, you must call GetLastWin32Error instead of writing your own platform invoke definition for GetLastError and calling it. 公共语言运行时可以对覆盖操作系统维护的 GetLastError 的 Api 进行内部调用。The common language runtime can make internal calls to APIs that overwrite the GetLastError maintained by the operating system.

仅当将 System.Runtime.InteropServices.DllImportAttribute 应用到方法签名并将 DllImportAttribute.SetLastError 字段设置为 true时,才能使用此方法获取错误代码。You can use this method to obtain error codes only if you apply the System.Runtime.InteropServices.DllImportAttribute to the method signature and set the DllImportAttribute.SetLastError field to true. 此过程的过程因所使用的源语言而异C# : C++默认情况下 false,但 Visual Basic 中的 Declare 语句是 true的。The process for this varies depending upon the source language used: C# and C++ are false by default, but the Declare statement in Visual Basic is true.

.NET Core 上的 GetLastWin32Error 方法的行为有所不同,并且在 trueDllImportAttribute.SetLastError 时 .NET Framework。There is a difference in the behavior of the GetLastWin32Error method on .NET Core and .NET Framework when DllImportAttribute.SetLastError is true. 在 .NET Framework 上,GetLastWin32Error 方法可将错误信息从一个 P/Invoke 调用保留到下一个。On .NET Framework, the GetLastWin32Error method can retain error information from one P/Invoke call to the next. 在 .NET Core 上,在 P/Invoke 调用之前会清除错误信息,而 GetLastWin32Error 仅表示来自最后一个方法调用的错误信息。On .NET Core, error information is cleared before P/Invoke call, and the GetLastWin32Error represents only error information from the last method call.

Applies to

See also