FormatMessage函数
我们写程序,调试出错时用的一个重要函数是 GetLastError(),它会返回一个非负数字给我们,在VS的工具--错误查找里面看相应的描述。
今天看《Windows核心编程》时,发现一个FormatMessage函数,能够自动将错误代码转换成汉语或英语描述,所以参考书上的例子,自己实现了一下。
也可以把其中的子函数嵌入其他程序中,出错的时候,直接调用自己写的函数,不用再去工具里面查看了。
这是函数原型
DWORD
WINAPI
FormatMessageW(
_In_ DWORD dwFlags,
_In_opt_ LPCVOID lpSource,
_In_ DWORD dwMessageId,
_In_ DWORD dwLanguageId,
_Out_ LPWSTR lpBuffer,
_In_ DWORD nSize,
_In_opt_ va_list *Arguments
);
代码是一些死知识,没有什么需要理解的地方,记录下来就行了。
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;
void Search();
int main()
{
setlocale(LC_ALL, "Chinese-simplified"); //汉语显示
Search();
return 0;
}
void Search()
{
DWORD dwError = 0;
printf("请输入要查找的错误号码:\r\n");
cin >> dwError;
HANDLE LocaleHandle = NULL;
// MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL) 汉语
// MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US) 英语
DWORD LocaleSystem = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);
// 获得文本描述
// typedef int BOOL;
BOOL bOk = FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL, dwError, LocaleSystem,
(PTSTR)&LocaleHandle, 0, NULL);
if (!bOk)
{
// 可能是网络错误
HMODULE hDll = LoadLibraryEx(TEXT("netmsg.dll"), NULL, DONT_RESOLVE_DLL_REFERENCES);
if (hDll != NULL)
{
bOk = FormatMessage(
FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_ALLOCATE_BUFFER,
hDll, dwError, LocaleSystem,
(PTSTR)&LocaleHandle, 0, NULL);
FreeLibrary(hDll);
}
}
if (bOk && (LocaleHandle != NULL))
{
LPVOID v1 = LocalLock(LocaleHandle);
printf("错误类型描述: %ls\r\n", v1);
LocalFree(LocaleHandle);
}
else
{
MessageBox(0, L"No text found for this error number.", 0, 0);
}
}
posted on 2017-09-18 15:50 kekoukele987 阅读(1678) 评论(0) 收藏 举报
浙公网安备 33010602011771号