我们写程序,调试出错时用的一个重要函数是 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); } }