【问题标题】:Should I check CreateWindowEx() for failure?我应该检查 CreateWindowEx() 是否失败?
【发布时间】:2014-11-25 06:05:59
【问题描述】:

我应该检查CreateWindowEx() 函数调用是否失败?如果它失败了我该怎么办,我的意思是如果我正在创建一组按钮并且其中一个函数调用失败,我应该一起关闭应用程序吗?我的意思是缺少一个按钮会使应用程序毫无用处。

【问题讨论】:

  • 是的,您应该检查您是否获得了有效的句柄,如果函数返回 NULL 出现问题,您可以使用 GetLastError() 获取错误代码。你采取什么行动取决于函数失败的原因。
  • 如果我没有得到有效的句柄(这意味着我认为按钮没有创建),我应该显示错误消息并关闭应用程序吗?
  • 缺少一个按钮会使应用程序无用您的答案 -> 用MessageBox 通知用户按钮创建失败并关闭应用程序。您至少可以编写一个小日志(作为.txt 文件),其中包含相关信息。这样用户就可以提交这个“错误报告”,你在调试时会有一些指导......
  • 我认为这仍然取决于CreateWindowEx() 失败的原因。您可以使用FormatMessage() 以及从GetLastError() 返回的错误代码来获得更易读的错误消息。

标签: winapi


【解决方案1】:

我认为您始终应该检查来自CreateWindowEx() 的返回值。如果返回值为NULL,那么您就知道出了点问题,您可以采取一些措施来应对。当出现问题时你会做什么取决于你,例如你可以显示一个带有错误描述的消息框,或者你可以将错误记录到文件中,等等:

// Try to create your window
HWND hwnd = CreateWindowEx(...);

// check if the handle is valid
if(hwnd == NULL) {

   // display a MessageBox() with a descriptive error message
   LPVOID lpErrorMessage;
   DWORD dwErrorCode = GetLastError();

   FormatMessage(
      FORMAT_MESSAGE_ALLOCATE_BUFFER | 
      FORMAT_MESSAGE_FROM_SYSTEM |
      FORMAT_MESSAGE_IGNORE_INSERTS,
      NULL,
      dwErrorCode,
      MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
      (LPTSTR) &lpErrorMessage,
      0, NULL 
  );
  MessageBox(NULL, (LPCTSTR)lpErrorMessage, TEXT("Error"), MB_OK);

  // don't forget to free the buffer allocated by FormatMessage
  LocalFree(lpErrorMessage);

  // terminate process
  ExitProcess(dwErrorCode);
}

【讨论】:

    猜你喜欢
    • 2011-12-17
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    相关资源
    最近更新 更多