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("请输入要查找的错误号码:
");
	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
", v1);

		LocalFree(LocaleHandle);
	}
	else
	{
		MessageBox(0, L"No text found for this error number.", 0, 0);
	}
}

  

原文地址:https://www.cnblogs.com/kekoukele987/p/7543469.html