// using System.Runtime.InteropServices;
[ DllImport( "kernel32.dll", CharSet = CharSet.Auto/*, SetLastError = true */ ) ]
private static extern uint FormatMessage
(
uint dwFlags,
IntPtr lpSource,
uint dwMessageId,
uint dwLanguageId,
ref IntPtr lpBuffer,
uint nSize,
IntPtr Arguments
);
public string GetLastWin32ErrorMessage( )
{
return GetLastWin32ErrorMessage( Marshal.GetLastWin32Error( ) );
}
public string GetLastWin32ErrorMessage( int errorCode )
{
IntPtr buffer = IntPtr.Zero;
uint cnt = FormatMessage
(
0x00000100 | // FORMAT_MESSAGE_ALLOCATE_BUFFER
0x00000200 | // FORMAT_MESSAGE_IGNORE_INSERTS
0x00001000, // FORMAT_MESSAGE_FROM_SYSTEM
IntPtr.Zero,
( uint )errorCode,
0, // LANGIDs : Neutral, Thread, User, System, en-US
ref buffer,
0,
IntPtr.Zero
);
if ( cnt == 0 || buffer == IntPtr.Zero )
return String.Format( "Unknown error: {0}.", errorCode );
string errorMessage = Marshal.PtrToStringAuto( buffer, ( int )cnt );
Marshal.FreeHGlobal( buffer ); // LocalFree.
return errorMessage;
}