FormatMessage

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 - 6 avril 2007 à 17:03
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 9 avril 2007 à 00:16
Salut

Est-ce qu'il y a un équivalent à FormatMessage dans le framework svp ?

Pour éviter de passer par pinvoke j'utilise ça pour le moment, mais c'est pas terrible :

Debug.Fail( new Win32Exception( /* Marshal.GetLastWin32Error( ) */ ).Message ); // FormatMessage.

11 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
6 avril 2007 à 18:34
Je rêve ou tu as posé une question?
lol

<hr />
-Blog-
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
6 avril 2007 à 19:20
Oui ça m'arrive.. c'est pas la première fois quand même.

J'ai pas envie de lire la doc de FormatMessage, c'est long !!
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
8 avril 2007 à 08:47
Salut,

Lol
En tout cas à ma connaissance non. Les constructeurs de Win32Exception reposent évidemment sur FormatMessage, mais il faut passer par là ou redéfinir GetErrorMessage.

/*
coq
MVP Visual C#
CoqBlog
*/
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
8 avril 2007 à 23:15
Bon je m'y suis collé.. à l'inverse de l'implémentation de Microsoft je laisse la fonction allouer le buffer. Si elle vous semble correct je la posterai sur Codyx.

[ 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( )
{
    uint errorCode = ( uint )Marshal.GetLastWin32Error( );
    IntPtr buffer = IntPtr.Zero;


    uint cnt = FormatMessage
    (
        0x00000100 |    // FORMAT_MESSAGE_ALLOCATE_BUFFER
        0x00000200 |    // FORMAT_MESSAGE_IGNORE_INSERTS
        0x00001000,     // FORMAT_MESSAGE_FROM_SYSTEM
        IntPtr.Zero,
        errorCode,
        0,              // LANGIDs : Neutral, Thread, User, System, en-US
        ref buffer,
        0,
        IntPtr.Zero
    );


    if ( cnt 0 || buffer IntPtr.Zero )
        return "Unknown error: " + errorCode + ".";


    string errorMessage = Marshal.PtrToStringAuto( buffer, ( int )cnt );
    Marshal.FreeHGlobal( buffer ); // LocalFree.


    return errorMessage;
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
8 avril 2007 à 23:31
Ben à priori oui, à part
    return "Unknown error: " + errorCode + ".";
à qui je préfère
    return String.Format("Unknown error: {0}.", errorCode);
^^

/*
coq
MVP Visual C#
CoqBlog
*/
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
8 avril 2007 à 23:37
En fait non une réflexion : je pense qu'à l'usage laisser la possibilité à l'appelant de passer le code d'erreur est plus viable (il préfèrera sans doute l'avoir rien que pour la gestion de l'erreur)
Donc ça mérite bien une petite surcharge :-)

public string GetLastWin32ErrorMessage( )
{
   uint errorCode = ( uint )Marshal.GetLastWin32Error( );
    return this.GetLastWin32ErrorMessage(errorCode );
}

public string GetLastWin32ErrorMessage( uint 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,
        errorCode,
        0,              // LANGIDs : Neutral, Thread, User, System, en-US
        ref buffer,
        0,
        IntPtr.Zero
    );
    if ( cnt 0 || buffer IntPtr.Zero )
        return "Unknown error: " + errorCode + ".";

    string errorMessage = Marshal.PtrToStringAuto( buffer, ( int )cnt );
    Marshal.FreeHGlobal( buffer ); // LocalFree.

    return errorMessage;
}

/*
coq
MVP Visual C#
CoqBlog
*/
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
8 avril 2007 à 23:39
Bha tu sais quoi j'ai pensé à toi quand j'ai écris cette ligne, je me suis dit Coq va me dire qu'il préfère String.Format..  Mais tu as raison c'est moins couteux et plus élégant.
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
8 avril 2007 à 23:42
Arf, je suis prévisible

/*
coq
MVP Visual C#
CoqBlog
*/
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
8 avril 2007 à 23:45
Ok pour la surcharge.. Je sais pas quoi lui donner comme nom au snippet !??
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
9 avril 2007 à 00:14
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
9 avril 2007 à 00:16
Exact :-)
Ca tombe bien, je ne suis pas doué pour les titres non plus.

/*
coq
MVP Visual C#
CoqBlog
*/
0
Rejoignez-nous