Heim >Backend-Entwicklung >C#.Net-Tutorial >Detaillierte Einführung zum Aufrufen der FormatMessage-API in C#
FormatMessage ist eine von WINDOWS bereitgestellte API, die zum Abrufen der Textinformationen verwendet wird, die dem Fehlercode entsprechen, der beim Aufruf der Windows-API zurückgegeben wird. Sie wurde unter VB verwendet vorher, aber in C# verwendet, hauptsächlich weil ich nicht viel über einige Regeln zum Aufrufen der Windows-API in C# weiß.
Vor kurzem habe ich mich sehr für die Entwicklung von Mobiltelefonprogrammen mit VC++ WIN32 interessiert, das ich schon lange nicht mehr verwendet habe Schreiben Sie viel C# und verwenden Sie dann erneut VB. Ich war es nicht gewohnt, also habe ich diese Methode unter C# aufgerufen. Warum nicht direkt in C++ verwenden? Nun, das Debuggen auf MobilgerätenDWORD 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);Dies ist der FormatMessage-API-Prototyp und die Definition in C#. Der zweite und letzte Parameter werden nicht verwendet, daher können sie als IntPtr oder int definiert werden, wenn 0 aufgerufen wird wird übergeben, wenn IntPtr übergeben wird, wird IntPtr.Zero übergeben. Was noch ärgerlicher ist, ist der Parameter lpBuffer, der zum Empfangen der zurückgegebenen Textinformationen verwendet wird. In VB wird dieser Parametertyp als ByVal String definiert und dann mit Leerzeichen (Länge) initialisiert (put In C# verwende ich eine ähnliche Methode. Der Parameter ist als Zeichenfolge lpBuffer definiert:
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);Sie können wissen, dass die Der Versuch, es in „ref“ oder „out“ zu ändern, funktioniert nicht. „ref“ meldet direkt einen Zeigerfehler und „out“ bedeutet, dass der Funktionsaufruf fehlschlägt. Später fiel mir ein, dass die Verarbeitung von Zeichenfolgen in C# der in C ähnelt. Sie behandeln sie als Zum Schluss ändern Sie es in StringBuilder und modifizieren es mit dem Attribut [Out] Erfolgreich!
StringBuilder lpBuffer=new StringBuilder(260); //声明StringBuilder的初始大小 int count=FormatMessage(dwFlags,IntPtr.Zero,1439,0,lpBuffer,260,IntPtr.Zero);
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung zum Aufrufen der FormatMessage-API in C#. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!