windows核心编程---错误处理

来源:互联网 发布:only网络营销策划方案 编辑:程序博客网 时间:2024/05/16 10:48
如果我们自己写程序的时候检测到一个错误的时候,可能希望向用户显示错误的文本表述,而不是一个干巴巴的错误代码windows提供了一个函数可以将错误代码转换成错误文本描述,这个函数是FormatMessage。

TheFormatMessage function formats a message string. The function requires a message definition as input. The message definition can come from a buffer passed into the function. It can come from a message table resource in an already-loaded module. Or the caller can ask the function to search the system's message table resource(s) for the message definition. The function finds the message definition in a message table resource based on a message identifier and a language identifier. The function copies the formatted message text to an output buffer, processing any embedded insert sequences if requested.

[cpp] view plaincopyprint?
  1. DWORD FormatMessage(
  2. DWORD dwFlags, // source and processing options
  3. LPCVOID lpSource,// message source
  4. DWORD dwMessageId, // message identifier
  5. DWORD dwLanguageId,// language identifier
  6. LPTSTR lpBuffer, // message buffer
  7. DWORD nSize, // maximum size of message buffer
  8. va_list *Arguments // array of message inserts
  9. );
参数说明:

  dwFlags:

  标志位,决定如何说明lpSource参数,dwFlags的低位制定如何处理换行功能在输出缓冲区,也决定最大宽度的格式化输出行。

  可选参数:
标志
标志说明
FORMAT_MESSAGE_ALLOCATE_BUFFER
0x00000100
函数会分配一个足够大的缓冲区保存格式化消息,并且通过lpBuffer指向该
地址。
FORMAT_MESSAGE_ARGUMENT_ARRAY
0x00002000
Arguments参数不是指向va_list结构体,但是是一个指向保存参数的数据。
FORMAT_MESSAGE_FROM_HMODULE
0x00000800
lpSource参数是需要去搜索的一个包含消息表的模块线程。如果lpSource
是NULL,当前进程的应用图像会被搜索,这个标志不能同FORMAT_ME
SSAGE_FROM_STRING使用。
FORMAT_MESSAGE_FROM_STRING
0x00000400
lpSource参数是一个指向以NULL结尾的字符串,字符串包含一个消息定义,
这个消息定义可以包含插入序列。此标志最好不要和FORMAT_MESSAGE_F
ROM_HMODULE或者FORMAT_MESSAGE_FROM_SYSTEM使用
FORMAT_MESSAGE_FROM_SYSTEM
0x00001000
函数会为了请求的信息而搜索系统的消息表资源。如果标志同时也指定了
FORMAT_MESSAGE_FROM_HMODULE,那么函数会先在lpSource指定
的模块中搜索请求的消息,如果搜索不到,就去搜索系统消息表资源。此
标志不能与FORMAT_MESSAGE_FROM_STRING使用。
FORMAT_MESSAGE_IGNORE_INSERTS
0x00000200
消息定义中的插入序列会被一直忽略和跳过直到输出缓冲区不改变,并且
Arguments会被忽略。
  lpSource:
  根据dwFlags标志而定。
  dwMessageId:
  请求的消息的标识符。当dwFlags标志为FORMAT_MESSAGE_FROM_STRING时会被忽略。
  dwLanguageId:
  请求的消息的语言标识符。
  nSize:
  如果FORMAT_MESSAGE_ALLOCATE_BUFFER标志没有被指定,这个参数必须指定为输出缓冲区的大小,
  如果指定,这个参数指定为分配给输出缓冲区的最小数。
  Arguments:
  保存格式化信息中的插入值的一个数组。
  返回值

  如果函数调用成功,返回输出缓冲区的大小,除最后一个空字符。如果失败侧返回0。


资源文件:

[plain] view plaincopyprint?
  1. //
  2. // Dialog
  3. //
  4. IDD_DIALOG1 DIALOGEX 0, 0, 177, 83
  5. STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
  6. EXSTYLE WS_EX_APPWINDOW
  7. CAPTION "Dialog"
  8. FONT 8, "MS Shell Dlg", 400, 0, 0x1
  9. BEGIN
  10. DEFPUSHBUTTON "确定",IDOK,114,11,50,14
  11. LTEXT "Error:",IDC_STATIC,10,12,20,14
  12. EDITTEXT IDC_ERRORCODE,38,11,40,14,ES_AUTOHSCROLL
  13. EDITTEXT IDC_ERRORTEXT,10,28,156,45,ES_MULTILINE | ES_AUTOHSCROLL
  14. END

代码:

[cpp] view plaincopyprint?
  1. #include <windows.h>
  2. #include "resource.h"
  3. LRESULT CALLBACK DialogProc(HWND ,UINT,WPARAM,LPARAM) ;
  4. void OnInitDialog(HWND hDlg);
  5. void OnOK(HWND hDlg);
  6. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nShowCmd)
  7. {
  8. MSG msg;
  9. HWND hwnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DialogProc);
  10. ShowWindow(hwnd, SW_SHOW);
  11. UpdateWindow(hwnd);
  12. while(GetMessage(&msg, NULL, 0, 0))
  13. {
  14. if( !IsDialogMessage( hwnd, &msg ) )
  15. {
  16. TranslateMessage(&msg);
  17. DispatchMessage(&msg);
  18. }
  19. }
  20. return msg.wParam;
  21. }
  22. LRESULT CALLBACK DialogProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
  23. {
  24. switch(uMsg)
  25. {
  26. case WM_INITDIALOG:
  27. OnInitDialog(hWnd);
  28. SetWindowPos(hWnd,NULL,500,200,0,0,SWP_NOSIZE);
  29. return TRUE;
  30. case WM_COMMAND:
  31. if(LOWORD(wParam) == IDOK)
  32. {
  33. OnOK(hWnd);
  34. return TRUE;
  35. }
  36. if(LOWORD(wParam) == IDCANCEL)
  37. {
  38. PostQuitMessage(0);
  39. return TRUE;
  40. }
  41. break;
  42. case WM_DESTROY:
  43. PostQuitMessage(0);
  44. break;
  45. }
  46. return FALSE;
  47. }
  48. void OnInitDialog(HWND hDlg)
  49. {
  50. SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(NULL,
  51. MAKEINTRESOURCE(IDI_ICON1)));
  52. SendMessage(hDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(NULL,
  53. MAKEINTRESOURCE(IDI_ICON1)));
  54. SetDlgItemInt(hDlg, IDC_ERRORCODE, 0, FALSE);
  55. }
  56. void OnOK(HWND hDlg)
  57. {
  58. DWORD dwError = GetDlgItemInt(hDlg,IDC_ERRORCODE,NULL, FALSE);
  59. LPVOID lpMsgBuf;
  60. FormatMessage(
  61. FORMAT_MESSAGE_ALLOCATE_BUFFER |
  62. FORMAT_MESSAGE_FROM_SYSTEM |
  63. FORMAT_MESSAGE_IGNORE_INSERTS,
  64. NULL,
  65. dwError,
  66. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  67. (PTSTR)&lpMsgBuf, 0, NULL );
  68. SetDlgItemText(hDlg,IDC_ERRORTEXT,(PCTSTR)lpMsgBuf);
  69. // Free the buffer.
  70. LocalFree(lpMsgBuf);
  71. }