[DllImport("kernel32.dll")]
static extern uint GetLastError();
// GetLastError is save!
Tested extensively here http://stackoverflow.com/questions/17918266/winapi-getlasterror-vs-marshal-getlastwin32error
// You should never PInvoke to GetLastError. Call Marshal.GetLastWin32Error instead!
' You should never PInvoke to GetLastError. Call Marshal.GetLastWin32Error instead!
[DllImport("kernel32.dll")]
def GetLastError() as int:
pass
Calling GetLastError directly via PInvoke is not guaranteed to work due to the CLR's internal interaction with the operating system. Instead, call Marshal.GetLastWin32Error.
Don't forget to include [SetLastError = true] in your function definition. For example:
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool CloseHandle(IntPtr hObject);
To retrieve the error message corresponding to this error code, you can use the Win32Exception class, as explained in the FormatMessage page (look at the bottom of the page).
System.Runtime.InteropServices.Marshal.GetLastWin32Error
Call GetLastWin32Error immediately after the Win32 API call or the result is unpredictable. See MSDN:
http://msdn.microsoft.com/en-us/library/ms182199(v=vs.80).aspx