FormatMessage的用法
来源:互联网 发布:数据可视化是什么 编辑:程序博客网 时间:2024/05/17 09:31
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): 拒绝访问。
- FormatMessage的用法
- FormatMessage 的用法
- FormatMessage的用法
- FormatMessage函数的用法
- FormatMessage的用法
- FormatMessage的用法
- FormatMessage函数的用法
- FormatMessage函数的用法
- FormatMessage函数的用法
- FormatMessage函数的用法
- FormatMessage函数的用法
- FormatMessage函数的用法
- FormatMessage函数的用法
- FormatMessage 用法
- 《解读Windows 核心编程》 之 FormatMessage()的用法
- FormatMessage 的使用
- FormatMessage
- FormatMessage
- 未能解析引用的程序集……因为它对不在当前目标框架……
- 一个人的命运决定于晚上8点到10点之间
- 谁下地狱
- DTE与DCE的区别
- 偷了世界的程序员(真正让我们成为局域网的不是那个墙,而是我们自己的肤浅)
- FormatMessage的用法
- 动态添加删除表格
- IT外企那点儿事(3):奇怪的面试
- MTK MODIS 出现的一个问题 MTK程序编译
- 什么是驱动程序?
- v.25和v.35电缆有什么不同
- 全方位掌握nsis脚本
- Sourcegrid 导出到Excel 通用方法
- 听君一席话,胜读十年书