19 Stimmen

Warum kann FormatMessage() keine Nachricht für WinINet-Fehler finden?

Ich führe dies zum Testen aus FormatMessage :

LPVOID lpMsgBuf;
errCode=12163;

FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM ,
    0,
    errCode,
    0,
    (LPTSTR) &lpMsgBuf,
    0, NULL );

Wenn sie jedoch zurückkehrt lpMsgBuf enthält NULL... Ich hatte etwas erwartet wie ERROR_INTERNET_DISCONNECTED .

Sieht irgendetwas falsch aus? Danke!

31voto

Shog9 Punkte 151504

Das ist ein WinINet-Fehler, und deshalb befindet sich die dazugehörige Meldung in WinINet.dll. Sie müssen nur FormatMessage() darüber informieren, damit es die richtige Meldung abrufen kann:

FormatMessage( 
   // flags:
   FORMAT_MESSAGE_ALLOCATE_BUFFER  // allocate buffer (free with LocalFree())
   | FORMAT_MESSAGE_IGNORE_INSERTS // don't process inserts
   | FORMAT_MESSAGE_FROM_HMODULE,  // retrieve message from specified DLL
   // module to retrieve message text from
   GetModuleHandle(_T("wininet.dll")),
   // error code to look up
   errCode,
   // default language
   0, 
   // address of location to hold pointer to allocated buffer
   (LPTSTR)&lpMsgBuf, 
   // no minimum size
   0, 
   // no arguments
   NULL );

Dies ist offiziell auf MSDN unter dem "Abschnitt "Behandlung von Fehlern der WinINet-Dokumentation.

Beachten Sie, dass Sie die FORMAT_MESSAGE_FROM_SYSTEM wieder ein, wenn Sie diese Routine für Fehler verwenden wollen, die möglicherweise pas von WinINet stammen: mit dieser Markierung, FormatMessage() greift auf die Systemmeldetabelle zurück, wenn der Fehler nicht in wininet.dll gefunden wird. Allerdings, tun pas das Flag FORMAT_MESSAGE_IGNORE_INSERTS entfernen .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X