Maison  >  Article  >  développement back-end  >  Introduction détaillée à l'appel de l'API FormatMessage en C#

Introduction détaillée à l'appel de l'API FormatMessage en C#

黄舟
黄舟original
2017-03-15 10:10:041734parcourir

FormatMessage est une API fournie par WINDOWS, qui permet d'obtenir les informations textuelles correspondant au code d'erreur renvoyé lors de l'appel de l'API Windows. Elle a été utilisée sous VB. avant, mais en C#, principalement parce que je ne connais pas grand-chose de certaines règles d'appel de l'API Windows en C#.

Récemment, je suis soudainement devenu très intéressé par le développement de programmes de téléphonie mobile utilisant VC WIN32. J'ai choisi le C que je n'ai pas utilisé depuis longtemps. Bien sûr, je dois fréquemment utiliser l'API Windows. écrire beaucoup de C#, puis utiliser à nouveau VB. J'étais un peu mal à l'aise, alors j'ai appelé cette méthode sous C#. Pourquoi ne pas simplement l'utiliser en C ? Eh bien, le débogage sur mobile

est un peu fastidieux et je ne veux pas écrire trop de code C# est quand même beaucoup plus pratique et plus rapide à utiliser.

DWORD WINAPI FormatMessage(    
in          
DWORD dwFlags,    
in          
LPCVOID lpSource,   
 in         
  DWORD dwMessageId,   
   in         
    DWORD dwLanguageId,    
    out         
    LPTSTR lpBuffer,    
    in          
    DWORD nSize,   
     in          
     va_list* Arguments  
     );
 const int FORMAT_MESSAGE_FROM_SYSTEM = 0x1000;
        const int FORMAT_MESSAGE_IGNORE_INSERTS = 0x200;
        [DllImport("Kernel32.dll")]
        private static extern int FormatMessage(uint dwFlags, IntPtr lpSource, uint dwMessageId, uint dwLanguageId, 
        [Out]StringBuilder lpBuffer, uint nSize, IntPtr arguments);
Il s'agit du prototype et de la définition de l'API FormatMessage en C#. Les deuxième et dernier paramètres ne sont pas utilisés, ils peuvent donc être définis comme IntPtr ou int. S'il s'agit d'un int, appelez If 0. est transmis, si IntPtr est transmis, IntPtr.Zero est transmis.

Ce qui est plus ennuyeux, c'est le paramètre lpBuffer, qui est utilisé pour recevoir les informations textuelles renvoyées. En VB, ce type de paramètre est défini comme ByVal String, puis initialisé avec Space (length) (put String

est initialisé avec un espace de longueur spécifiée), spécifiez simplement la valeur de longueur pour nSize lors de l'appel. En C#, j'utilise une méthode similaire. Le paramètre est défini comme une chaîne lpBuffer Lors de l'appel :

Vous pouvez savoir que la fonction
  uint dwFlags= FORMAT_MESSAGE_FROM_SYSTEM  |  FORMAT_MESSAGE_IGNORE_INSERTS ;      
        string lpBuffer=new string(' ',260);
        int count=FormatMessage(dwFlags,IntPtr.Zero,1439,0,lpBuffer,260,IntPtr.Zero);

est appelée avec succès. par le nombre de valeurs de retour, mais la valeur de lpBuffer n'a pas changé. Essayer de le changer en ref ou out ne fonctionne pas. Ref signale directement une erreur de pointeur, et out signifie que l'appel de fonction échoue.

Plus tard, je me suis souvenu que le traitement de la chaîne en C# est similaire à celui en C. Ils la traitent comme une

constante

Modifier la valeur d'une chaîne signifie en fait supprimer la chaîne et la déclarer. . Une nouvelle chaîne. Évidemment, le paramètre de sortie ne peut pas être défini ici comme une chaîne. Enfin, changez-le en StringBuilder et modifiez-le avec l'attribut [Out]

Lors de l'appel :

Succès !
   StringBuilder lpBuffer=new StringBuilder(260);    //声明StringBuilder的初始大小
        int count=FormatMessage(dwFlags,IntPtr.Zero,1439,0,lpBuffer,260,IntPtr.Zero);

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn