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

Post date: 2012/3/27 上午 07:48:36

分类: Direct3D2007-11-30 22:28 3385人阅读 评论(1) 收藏 举报

在开发软件的过程里,经常要做的工作就是调试程序,许多问题的出现,不但是逻辑的问题,还有可能是对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

);

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