Như đã chỉ ra trong các câu trả lời khác:
FormatMessage
nhận DWORD
kết quả không phải là HRESULT
(thường GetLastError()
).
LocalFree
cần thiết để giải phóng bộ nhớ được cấp phát bởi FormatMessage
Tôi đã lấy những điểm trên và thêm một vài điểm nữa cho câu trả lời của mình:
- Gói
FormatMessage
trong một lớp để cấp phát và giải phóng bộ nhớ khi cần thiết
- Sử dụng quá tải toán tử (ví dụ:
operator LPTSTR() const { return ...; }
để lớp của bạn có thể được sử dụng như một chuỗi
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;
};
Tìm phiên bản hoàn chỉnh hơn của đoạn mã trên tại đây: https://github.com/stephenquan/FormatMessage
Với lớp trên, cách sử dụng đơn giản là:
std::wcout << (LPTSTR) CFormatMessage(GetLastError()) << L"\n";