我們寫程序,調試出錯時用的一個重要函數是 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);
}
}
