Obtenir le message d'erreur d'une fonction Win32

Contenu du snippet

// 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;
}


Compatibilité : C# 1.x, C# 2.x

Disponible dans d'autres langages :

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.