Windows API一日一练(80)FormatMessage函数

在开发软件的过程里,经常要做的工作就是调试程序,许多问题的出现,不但是逻辑的问题,还有可能是对API的不熟悉,或者某种条件下调用API会出错的。那么这些出错的原因是什么呢?通常只获取到错误码,也就是通过函数GetLastError得到。当然可以根据这个错误码去查找MSDN就可以知道出错的原因,但有时在客户那里并没有MSDN,那么就需要把调用API函数出错的信息显示出来,或者写到LOG里去。这时就需要调用函数FormatMessage把出错码详细原因显示出来。
 
函数FormatMessage声明如下:
 
WINBASEAPI
DWORD
WINAPI
FormatMessageA(
    DWORD dwFlags,
    LPCVOID lpSource,
    DWORD dwMessageId,
    DWORD dwLanguageId,
    LPSTR lpBuffer,
    DWORD nSize,
    va_list *Arguments
    );
WINBASEAPI
DWORD
WINAPI
FormatMessageW(
    DWORD dwFlags,
    LPCVOID lpSource,
    DWORD dwMessageId,
    DWORD dwLanguageId,
    LPWSTR lpBuffer,
    DWORD nSize,
    va_list *Arguments
    );

     dwFlags,指定格式化程序以及解释lpsource参数的方法。
     lpSource,消息定义指针
     dwMessageId,为要求消息指定32位信息标识符
     dwLanguageId,不支持
     lpBuffer,指向一个格式化消息的缓冲区
     nSize,指定输出缓冲区大小
    Arguments指向在格式化消息中被用来插入数值的一个32位数值的数组

#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): 拒绝访问。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值