ตามที่ระบุไว้ในคำตอบอื่น ๆ :
FormatMessage
ใช้DWORD
ผลไม่ได้เป็นHRESULT
(โดยทั่วไปGetLastError()
)
LocalFree
จำเป็นต้องปล่อยหน่วยความจำที่จัดสรรโดย FormatMessage
ฉันรับประเด็นข้างต้นและเพิ่มอีกสองสามข้อสำหรับคำตอบของฉัน:
- ห่อ
FormatMessage
ในคลาสเพื่อจัดสรรและปล่อยหน่วยความจำตามต้องการ
- ใช้ตัวดำเนินการเกินพิกัด (เช่น
operator LPTSTR() const { return ...; }
เพื่อให้คลาสของคุณสามารถใช้เป็นสตริงได้
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;
};
ค้นหาโค้ดด้านบนฉบับสมบูรณ์เพิ่มเติมได้ที่นี่: https://github.com/stephenquan/FormatMessage
ด้วยคลาสข้างต้นการใช้งานเป็นเพียง:
std::wcout << (LPTSTR) CFormatMessage(GetLastError()) << L"\n";