当前位置:C++技术网 > 资讯 > FormatMessage格式化错误消息示例详解

FormatMessage格式化错误消息示例详解

更新时间:2015-06-23 20:29:57浏览次数:1+次

     FormatMessage函数格式化系统错误码,得到错误的描述,并使用消息框显示出来。是对使用例子的解释,代码可以直接使用。

    示例代码

LPVOID lpMsgBuf; // 接受内部分配的消息缓存的内存地址
FormatMessage( 
FORMAT_MESSAGE_ALLOCATE_BUFFER | //使用内部分配内存
FORMAT_MESSAGE_FROM_SYSTEM | //从系统查找错误描述
FORMAT_MESSAGE_IGNORE_INSERTS,//忽略含%占位符的消息
NULL,//NULL表示从系统获取消息描述来源
GetLastError(),//获取上次出错的错误码
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 使用默认语言
(LPTSTR) &lpMsgBuf,//存放消息缓存地址
0,//如果没有设置FORMAT_MESSAGE_ALLOCATE_BUFFER内部分配缓存,则要指定外部缓存的大小,指定了设为0即可
NULL //格式化到%参数中的消息变量列表
);
MessageBox( NULL, (LPCTSTR)lpMsgBuf, _T("错误提示"), MB_OK | MB_ICONINFORMATION );
LocalFree( lpMsgBuf );


    一般系统的错误消息格式化,使用上面的即可,直接复制即可使用。
    函数的全面使用可以详细查询MSDN。下面稍作解释。
    第一个参数指定FORMAT_MESSAGE_ALLOCATE_BUFFER标志可以让系统在内部分配内存,最后返回一个内存的地址,我们只需要提供一个指针指向即可。此时倒数第二个参数的外部缓存大小设置为0,这个大小指示的是第一个参数不设置这个标志时需要我们自己分配一个缓存,然后将缓存的大小告诉函数,也就是将大小传入倒数第二个参数。
    第一个参数设置FORMAT_MESSAGE_FROM_SYSTEM表示从系统获得错误来源,因此第二个参数就设置为空,不需要指定错误来源了。如果第一个参数没设置这个标志,则需要在第二个参数设置一个错误来源,可以是字符串,DLL文件等,具体查看MSDN的解释。
    第一个参数设置FORMAT_MESSAGE_IGNORE_INSERTS,表示我们忽略%格式化消息,系统会根据特定上下文来格式化%里的替代字符串,如果我们是确定的消息,就忽略这个。如果我们无法预测会有哪些要格式化的内容,也要设置这个标志。如果没有设置这个标志,那么最后一个参数要给出变量列表去格式化%占位符,类似于printf的格式化。如果设置了,最后一个参数设为NULL即可。
    GetLastError()函数返回执行错误码。
    MAKELANGID是一个宏,设置语言ID的,这个对应的参数可以让我们的程序使用本机对应的语言来显示错误消息的语言类型,比如使用英文系统,则消息是英文的,如果是中文系统,则是中文的消息提示。具体的使用查看MSDN。
    特别要注意的是:LocalFree( lpMsgBuf );
    函数在内部为我们分配了内存之后,释放的工作需要我们来做。如果是指定了FORMAT_MESSAGE_ALLOCATE_BUFFER ,不要忘记释放内存。如果没有指定,则内部不分配内存,就不用执行这一句。不过我们自己分配的内存,如果是在堆中分配的,也是要释放的。