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 mobileDWORD 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);
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 fonctionuint 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
constanteModifier 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]
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!