// ErrorMsg.h #pragma once class CErrorMsg { public: CErrorMsg(void); virtual ~CErrorMsg(void); public: DWORD GetLastError(DWORD dwErrorId, LPTSTR lpszError, DWORD dwLength); private: LPCTSTR m_pErrorMsg; HLOCAL m_hLocal; }; // ErrorMsg.cpp #include "StdAfx.h" #include "ErrorMsg.h" CErrorMsg::CErrorMsg(void) : m_pErrorMsg(NULL), m_hLocal(NULL) { } CErrorMsg::~CErrorMsg(void) { if(NULL != m_hLocal) { LocalFree(m_hLocal); m_hLocal = NULL; } m_pErrorMsg = NULL; } DWORD CErrorMsg::GetLastError(DWORD dwErrorId, LPTSTR lpszError, DWORD dwLength) { if(NULL == m_pErrorMsg) { if(NULL != m_hLocal) { LocalFree(m_hLocal); m_hLocal = NULL; } if(!FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dwErrorId, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), (PTSTR)&m_hLocal, 0, NULL)) { return 0; } if(NULL == m_hLocal) { return 0; } m_pErrorMsg = (PCTSTR)LocalLock(m_hLocal); } if(NULL == lpszError) { if(NULL != m_pErrorMsg) { dwLength = _tcslen(m_pErrorMsg) + 1; } else { dwLength = 0; } } else { _tcscpy_s(lpszError, dwLength, m_pErrorMsg); m_pErrorMsg = NULL; if(NULL != m_hLocal) { LocalFree(m_hLocal); m_hLocal = NULL; } } return dwLength; } // Test code : #include "stdafx.h" #include "ErrorMsg.h" int _tmain(int argc, _TCHAR* argv[]) { CErrorMsg err; DWORD dwLength = 0; TCHAR* pBuf = NULL; dwLength = err.GetLastError(2, pBuf, 0); if(0 != dwLength) { pBuf = new TCHAR[dwLength]; } if(NULL != pBuf) { err.GetLastError(2, pBuf, dwLength); _tprintf(_T("%s\n"), pBuf); } delete[] pBuf; pBuf = NULL; return 0; }
FormatMessage格式化错误信息
猜你喜欢
转载自blog.csdn.net/visualeleven/article/details/7551909
今日推荐
周排行