woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

FormatMessage的用法

根据一个错误码返回一个错误讯息

DWORD FormatMessage(
    DWORD dwFlags,
    LPCVOID lpSource,
    DWORD dwMessageId,
    DWORD dwLanguageId,
    LPTSTR lpBuffer,
    DWORD nSize,
    va_list* Arguments
    );

dwFlags:
# FORMAT_MESSAGE_ALLOCATE_BUFFER // 此函数会分配内存以包含描述字串。
# FORMAT_MESSAGE_FROM_SYSTEM,  // 在系统的id映射表中寻找描述字串
# FORMAT_MESSAGE_FROM_HMODULE  // 在其他资源模块中寻找描述字串
# FORMAT_MESSAGE_FROM_STRING   // 消息ID是个字串,不是个DWORD
通常为:FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM

lpSource:
# 指定了FORMAT_MESSAGE_FROM_HMODULE的话,此参数表示模块的HANDLE
# 指定了FORMAT_MESSAGE_FROM_STRING的话,此参数表示id字串
通常为:NULL

dwMessageId:
消息ID;如果指定FORMAT_MESSAGE_FROM_STRING,将被忽略。

dwLanguageId:
消息描述所用的语言
通常为:0表示自动选择

lpBuffer:
#如果未指定FORMAT_MESSAGE_ALLOCATE_BUFFER,则为自己提供的缓冲区
#否则为系统LocalAlloc分配,需要被用户LocalFree

nSize:
#如果未指定FORMAT_MESSAGE_ALLOCATE_BUFFER,则为自己提供的缓冲区大小
#否则为系统LocalAlloc分配之最小缓冲区大小

Arguments:
通常不使用

下面是个例子:

TCHAR* buffer;
DWORD error = ERROR_DS_OBJ_STRING_NAME_EXISTS;
::FormatMessage(
    FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
    NULL,
    error,
    0,
    ( LPTSTR )&buffer,
    0,
    NULL );
::MessageBox( NULL, buffer, NULL, 0 );
LocalFree( buffer ); 
=======================================================================================

FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ALLOCATE_BUFFER,
  NULL,lVal,NULL,(LPTSTR)&hLocal,0,NULL);
第一个参数是标志,告诉这个FormatMessage函数,我想要的特点.
第三个参数是DWORD(unsigned long)类型
第五个参数是LPTSTR(这个类型即可用与ANSI,也克用与Unicode).用来接收与MessageID 对应的Description.

注意:hLocal是HLOCAL类型也就是HANDLE类型,需要将他转换到LPTSTR.
第六个参数是这个buffer的大小,由于设置了FORMAT_MESSAGE_ALLOCATE_BUFFER那么他就可以置0了

例如:

   char szError[256];
   DWORD dwError = GetLastError();
   FormatMessage(
    FORMAT_MESSAGE_FROM_SYSTEM,
    NULL,                       
    0,
    0,
    szError,
    sizeof(szError),
    NULL);
   AfxMessageBox(szError);

=======================================================================================

FormatMessage功能就是将GetLastError得到的错误信息(这个错误信息是数字代号)转化成字符串信息的函数
FormatMessage()
函数FormatMessage声明如下:
WINBASEAPI
DWORD
WINAPI
FormatMessageA(
    DWORD dwFlags,//错误信息类型标志
    LPCVOID lpSource,//指定本地信息定义 其依赖于第一个参数的设置
    DWORD dwMessageId,//指定被请求的消息标示,如果dwFlags设置为FORMAT_MESSAGE_FROM_STRING 这个参数将被忽略
    DWORD dwLanguageId,//指定被请求的消息的语言标示
    LPSTR lpBuffer,//用来保存格式话后的消息字符串的地址
    DWORD nSize,//如果第一个参数为指定FORMAT_MESSAGE_ALLOCATE_BUFFER 这个参数就是字符串的最大长度
    va_list *Arguments
    );
WINBASEAPI
DWORD
WINAPI
FormatMessageW(
    DWORD dwFlags,
    LPCVOID lpSource,
    DWORD dwMessageId,
    DWORD dwLanguageId,
    LPWSTR lpBuffer,
    DWORD nSize,
    va_list *Arguments
    );
#ifdef UNICODE
#define FormatMessage FormatMessageW
#else
#define FormatMessage FormatMessageA
#endif // !UNICODE
调用函数的例子如下:
#001 //系统错误信息提示。
#002  //蔡军生 2007/11/28 QQ:9073204 深圳
#003  void TestErrorInfo(void)
#004  {
#005         //进行出错。
#006         if (!CreateDirectory(_T("c:\\"),0))
#007         {
#008               TCHAR szBuf[128];
#009               LPVOID lpMsgBuf;
#010               DWORD dw = GetLastError();
#011
#012              FormatMessage(
#013                   FORMAT_MESSAGE_ALLOCATE_BUFFER |
#014                   FORMAT_MESSAGE_FROM_SYSTEM,
#015                   NULL,
#016                   dw,
#017                   MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
#018                   (LPTSTR) &lpMsgBuf,
#019                   0, NULL );
#020
#021                wsprintf(szBuf,
#022                    _T("%s 出错信息 (出错码=%d): %s"),
#023                    _T("CreateDirectory"), dw, lpMsgBuf);
#024
#025               LocalFree(lpMsgBuf);
#026
#027               //输出提示。
#028               OutputDebugString(szBuf);
#029         }
#030        
#031  }
调用后输出下面的提示信息:
CreateDirectory 出错信息 (出错码=5): 拒绝访问。

posted on 2008-07-11 11:43 肥仔 阅读(1402) 评论(1)  编辑 收藏 引用 所属分类: MFC存档

评论

# re: FormatMessage的用法  回复  更多评论   

转载别人的东东,就要加出处和致谢,这是原则,来不得半点含糊!!!
2010-05-10 15:45 |

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理