Seperti yang ditunjukkan dalam jawaban lain:
FormatMessage
mengambil DWORD
hasil bukan HRESULT
(biasanya GetLastError()
).
LocalFree
diperlukan untuk melepaskan memori yang telah dialokasikan oleh FormatMessage
Saya mengambil poin di atas dan menambahkan beberapa lagi untuk jawaban saya:
- Bungkus
FormatMessage
dalam kelas untuk mengalokasikan dan melepaskan memori sesuai kebutuhan
- Gunakan kelebihan operator (misalnya
operator LPTSTR() const { return ...; }
agar kelas Anda dapat digunakan sebagai string
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;
};
Temukan versi yang lebih lengkap dari kode di atas di sini: https://github.com/stephenquan/FormatMessage
Dengan kelas di atas, penggunaannya sederhana:
std::wcout << (LPTSTR) CFormatMessage(GetLastError()) << L"\n";