Ich habe die FormatMessage-Funktion in der Windows-API verwendet, um Nachrichtenfolgen aus Systemfehlercodes zu generieren. Ich habe festgestellt, dass bei einigen Fehlercodes die vollständige Nachricht nicht erstellt wird.Warum erstellt FormatMessage nur Teilnachrichten für die Systemfehler ERROR_SYSTEM_PROCESS_TERMINATED und ERROR_UNHANDLED_EXCEPTION?
dieses Beispielprogramm als Beispiel:
int main()
{
wchar_t * buffer = nullptr;
FormatMessageW(
FORMAT_MESSAGE_FROM_SYSTEM
| FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_IGNORE_INSERTS,
nullptr,
ERROR_SYSTEM_PROCESS_TERMINATED,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
reinterpret_cast<LPWSTR>(&buffer),
0,
nullptr);
std::wcout << buffer << std::endl;
return 0;
}
MSDN Laut ich sollte folgendes sehen:
{Fehler Fatal System}
Die% hs Systemprozess unerwartet mit einem beendet Status von 0x% 08x (0x% 08x 0x% 08x). Das System wurde heruntergefahren.
jedoch im Beispielprogramm werde ich sehen:
{Schwere Systemfehler}
0x beendet
Der% hs Systemprozess unerwartet mit einem Status von
Ich bemerkte, dass ERROR_UNHANDLED_EXCEPTION
erstellt auch nicht die vollständige Nachricht (im Vergleich zur Liste auf MSDN). Beide erwarteten Nachrichten enthalten 0x% 08 Platzhalter, aber die Nachricht endet nach 0x.
Von dem was ich sehen kann, scheinen andere Fehlermeldungen den Listen auf MSDN zu entsprechen (d. H. Das Problem scheint auf ERROR_UNHANDLED_EXCEPTION
und ERROR_SYSTEM_PROCESS_TERMINATED
beschränkt zu sein).
Credit engf-010 - Sie das gleiche, wenn Sie die Fehlersuche-Tool in Visual Studio verwenden (Tools - Fehlersuche). Die Fehlercodes sind 574 und 591.
Weiß jemand, warum diese Nachrichten abgeschnitten werden?
Gibt es trotzdem die vollständige Nachricht?
Sie sollten immer den Rückgabewert von Systemaufrufen überprüfen! Es könnte ein wenig Licht auf Ihr Problem werfen. –
@ engf-010 - Wenn ich den letzten Fehler vor 'FormatMessageW' auf 0 setze, wird' GetLastError() 'unmittelbar nach' FormatMessageW' als 0 angezeigt. – camelCase
Als Randnotiz sollten Sie 'LocalFree' /' HeapFree' den Puffer verwenden zurückgegeben, wenn 'FORMAT_MESSAGE_ALLOCATE_BUFFER' verwendet wird. Auch wenn das in diesem kleinen Beispiel vielleicht nicht relevant ist. –