Marshal.GetLastWin32Error Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Vrátí kód chyby vrácený poslední nespravovanou funkcí, která byla volána pomocí volání platformy s nastaveným příznakem SetLastError .
public:
static int GetLastWin32Error();
[System.Security.SecurityCritical]
public static int GetLastWin32Error ();
public static int GetLastWin32Error ();
[<System.Security.SecurityCritical>]
static member GetLastWin32Error : unit -> int
static member GetLastWin32Error : unit -> int
Public Shared Function GetLastWin32Error () As Integer
Návraty
Poslední kód chyby nastavený voláním funkce Win32 SetLastError .
- Atributy
Příklady
Následující příklad volá metodu GetLastWin32Error
. Příklad nejprve ukazuje volání metody bez chyby a pak ukazuje volání metody s chybou.
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
Poznámky
V systémech GetLastWin32Error Windows nástroj zpřístupňuje funkci Win32 GetLastError z Kernel32.DLL. Tato metoda existuje, protože není spolehlivé provést přímé volání GetLastError
volání platformy k získání těchto informací. Pokud chcete získat přístup k tomuto kódu chyby, musíte GetLastWin32Error místo psaní vlastní platformy vyvolat definici a GetLastError
zavolat ji. Modul CLR (Common Language Runtime) může provádět interní volání rozhraní API, která přepíší GetLastError
rozhraní API udržovaná operačním systémem.
Tuto metodu můžete použít k získání kódů chyb pouze v případě, že použijete System.Runtime.InteropServices.DllImportAttribute na podpis metody a nastavíte DllImportAttribute.SetLastError pole na true
. Postup se liší v závislosti na použitém zdrojovém jazyce: ve výchozím nastavení jsou false
jazyk C# a C++ , ale Declare
příkaz v jazyce Visual Basic je true
.
Existuje rozdíl v chování GetLastWin32Error
metody v .NET Core a .NET Framework, když DllImportAttribute.SetLastError je true
. V rozhraní .NET Framework GetLastWin32Error
může metoda zachovat informace o chybě z jednoho volání volání P/Invoke do dalšího. V .NET Core se informace o chybě vymažou před voláním P/Invoke a GetLastWin32Error
představuje pouze informace o chybě z posledního volání metody.
V .NET 6 a novějších verzích je tato metoda funkčně ekvivalentní metodě GetLastPInvokeError, která má název lépe odrážet záměr rozhraní API a jeho multiplatformní povahu. GetLastPInvokeError by měla být upřednostněná před GetLastWin32Error.