• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
thankgoodness
博客园    首页    新随笔    联系   管理    订阅  订阅

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 @ 2009-05-21 15:14  宇晨  阅读(5222)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3