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);
	}
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM