Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung zum Aufrufen der FormatMessage-API in C#

Detaillierte Einführung zum Aufrufen der FormatMessage-API in C#

黄舟
黄舟Original
2017-03-15 10:10:041673Durchsuche

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äten

ist etwas umständlich und ich möchte nicht zu viel Code schreiben. C# ist viel bequemer und schneller zu verwenden.

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);
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

String wird mit einem Leerzeichen der angegebenen Länge initialisiert), geben Sie beim Aufruf einfach den Längenwert für nSize an.

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

-Funktion erfolgreich aufgerufen wurde durch den Rückgabewert count, aber der Wert von lpBuffer hat sich nicht geändert.

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

Konstante. Den Wert einer Zeichenfolge zu ändern bedeutet tatsächlich, die Zeichenfolge zu verwerfen und zu deklarieren . Offensichtlich kann der Ausgabeparameter hier nicht als String definiert werden.

Zum Schluss ändern Sie es in StringBuilder und modifizieren es mit dem Attribut [Out]

Beim Aufruf:

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn