Hier ist der richtige Weg ist aus dem System eine Fehlermeldung aus, um wieder für ein HRESULT
(benannt hresult in diesem Fall, oder Sie können es mit GetLastError()
ersetzen):
LPTSTR errorText = NULL;
FormatMessage(
// use system message tables to retrieve error text
FORMAT_MESSAGE_FROM_SYSTEM
// allocate buffer on local heap for error text
|FORMAT_MESSAGE_ALLOCATE_BUFFER
// Important! will fail otherwise, since we're not
// (and CANNOT) pass insertion parameters
|FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, // unused with FORMAT_MESSAGE_FROM_SYSTEM
hresult,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&errorText, // output
0, // minimum size for output buffer
NULL); // arguments - see note
if (NULL != errorText)
{
// ... do something with the string `errorText` - log it, display it to the user, etc.
// release memory allocated by FormatMessage()
LocalFree(errorText);
errorText = NULL;
}
Der Hauptunterschied zwischen dieser und David Hanaks Antwort ist die Verwendung des FORMAT_MESSAGE_IGNORE_INSERTS
Flags. MSDN ist ein wenig unklar, wie Einfügungen verwendet werden sollten, aber Raymond Chen notes that you should never use them beim Abrufen einer Systemnachricht, da Sie nicht wissen, welche Einfügungen das System erwartet.
FWIW, wenn Sie Visual C++ verwenden Sie Ihr Leben ein bisschen einfacher durch Verwendung der _com_error
Klasse machen kann:
{
_com_error error(hresult);
LPCTSTR errorText = error.ErrorMessage();
// do something with the error...
//automatic cleanup when error goes out of scope
}
nicht direkt von MFC oder ATL Teil so weit ich bewusst bin.
Vorsicht: Dieser Code verwendet hResult anstelle eines Win32-Fehlercodes: das sind verschiedene Dinge! Sie erhalten möglicherweise den Text eines vollständig anderen Fehlers als der, der tatsächlich aufgetreten ist. –
Hervorragender Punkt, @Andrei - und auch wenn der Fehler * ein Win32-Fehler ist, wird diese Routine nur gelingen, wenn es sich um einen * System * -Fehler handelt - ein robuster Fehlerbehandlungsmechanismus müsste die Quelle des Fehlers kennen Fehler, überprüfen Sie den Code vor dem Aufrufen von FormatMessage und möglicherweise stattdessen andere Quellen abfragen. – Shog9
@AndreiBelogortseff Wie kann ich wissen, was ich in jedem Fall verwenden soll? Zum Beispiel gibt 'RegCreateKeyEx' ein' LONG' zurück. Seine Dokumentation sagt, dass ich 'FormatMessage' verwenden kann, um den Fehler zu erhalten, aber ich muss das' LONG' in ein 'HRESULT' umwandeln. – csl