// Get the error code
DWORD dwError = GetDlgItemInt(IDC_ERRORCODE, NULL, FALSE);
HLOCAL hlocal = NULL; // Buffer that gets the error message string
// Get the error code's textual description
BOOL fOk = FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL, dwError, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
(PTSTR) &hlocal, 0, NULL);
if (!fOk) {
// Is it a network-related error?
HMODULE hDll = LoadLibraryEx(TEXT("netmsg.dll"), NULL,
DONT_RESOLVE_DLL_REFERENCES);
if (hDll != NULL) {
FormatMessage(
FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_FROM_SYSTEM,
hDll, dwError, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
(PTSTR) &hlocal, 0, NULL);
FreeLibrary(hDll);
}
}
if (hlocal != NULL) {
SetDlgItemText( IDC_ERRORTEXT, (PCTSTR) LocalLock(hlocal));
LocalFree(hlocal);
} else {
SetDlgItemText(IDC_ERRORTEXT, TEXT("Error number not found."));
}
第一个代码行用于从编辑控件中检索错误代码的号码。然后,建立一个内存块的句柄并将
它初始化为N U L L。F o r m a t M e s s a g e函数在内部对内存块进行分配,并将它的句柄返回给我们。
当调用F o r m a t M e s s a g e函数时,传递了F O R M AT M E S S A G E F R O M S Y S T E M标志。该标
志告诉F o r m a t M e s s a g e函数,我们想要系统定义的错误代码的字符串。还传递了F O R M AT _
M E S S A G E A L L O C AT E B U F F E R标志,告诉该函数为错误代码的文本描述分配足够大的内存
块。该内存块的句柄将在h l o c a l变量中返回。第三个参数指明想要查找的错误代码的号码,第
四个参数指明想要文本描述使用什么语言。
如果F o r m a t M e s s a g e函数运行成功,那么错误代码的文本描述就位于内存块中,将它拷贝
到对话框底部的滚动窗口中。如果F o r m a t M e s s a g e函数运行失败,设法查看N e t M s g . d l l模块中的
消息代码,以了解该错误是否与网络有关。使用N e t M s g . d l l 模块的句柄,再次调用
F o r m a t M e s s a g e函数。你会看到,每个D L L(或. e x e)都有它自己的一组错误代码,可以使用
Message Compiler(M C . e x e)将这组错误代码添加给该模块,并将一个资源添加给该模块。这
就是Visual Studio的Error Lookup工具允许你用M o d u l e s对话框进行的操作。