Come sottolineato in altre risposte:
FormatMessage
prende un DWORD
risultato non un HRESULT
(tipicamente GetLastError()
).
LocalFree
è necessario per rilasciare la memoria allocata da FormatMessage
Ho preso i punti precedenti e ne ho aggiunti altri per la mia risposta:
- Avvolgi il
FormatMessage
in una classe per allocare e rilasciare la memoria secondo necessità
- Usa l'overload dell'operatore (ad es. In
operator LPTSTR() const { return ...; }
modo che la tua classe possa essere usata come stringa
class CFormatMessage
{
public:
CFormatMessage(DWORD dwMessageId,
DWORD dwLanguageId = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)) :
m_text(NULL)
{
Assign(dwMessageId, dwLanguageId);
}
~CFormatMessage()
{
Clear();
}
void Clear()
{
if (m_text)
{
LocalFree(m_text);
m_text = NULL;
}
}
void Assign(DWORD dwMessageId,
DWORD dwLanguageId = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT))
{
Clear();
DWORD dwFlags = FORMAT_MESSAGE_FROM_SYSTEM
| FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_IGNORE_INSERTS,
FormatMessage(
dwFlags,
NULL,
dwMessageId,
dwLanguageId,
(LPTSTR) &m_text,
0,
NULL);
}
LPTSTR text() const { return m_text; }
operator LPTSTR() const { return text(); }
protected:
LPTSTR m_text;
};
Trova una versione più completa del codice sopra qui: https://github.com/stephenquan/FormatMessage
Con la classe precedente, l'utilizzo è semplicemente:
std::wcout << (LPTSTR) CFormatMessage(GetLastError()) << L"\n";