繁体   English   中英

从WndProc调用C ++虚拟函数失败

[英]Calling a c++ virtual function from WndProc fails

我正在开发一个使用Windows API显示图形窗口的程序。 下面是我注册窗口类时作为WndProc提供的函数-它是WindowsWindow类中的静态函数。

#define BTK_DLL_FUNC __dllspec(dllexport)

class AbstractBackend
{
protected:
  bool FatalWarnings;

public:
  AbstractBackend (bool FatalWarnings=false);
  ~AbstractBackend ();

  virtual void StartMainLoop () = 0;
  virtual void QuitMainLoop () = 0;
};

class WindowsBackend : public Base::AbstractBackend
{
public:
  static HINSTANCE hinstance;
  static WindowsBackend* instance;

public:
  BTK_DLL_FUNC WindowsBackend ();
  BTK_DLL_FUNC ~WindowsBackend ();

  BTK_DLL_FUNC void StartMainLoop ();
  BTK_DLL_FUNC void QuitMainLoop ();
};


void WindowsBackend::StartMainLoop ()
{
  MSG Msg;
  while (GetMessage (&Msg, NULL, 0, 0) > 0)
  {
    TranslateMessage (&Msg);
    DispatchMessage (&Msg);
  }
}

void WindowsBackend::QuitMainLoop ()
{
  PostQuitMessage (0); /* Send a WM_QUIT message, to stop the main loop */
}

LRESULT CALLBACK WindowsWindow::WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch (msg)
  {
  case WM_CREATE:
    break;

  case WM_CLOSE:
    DestroyWindow (hwnd);
    break;

  case WM_DESTROY: /* The window was destroyed */
    {
      WindowsBackend::instance->QuitMainLoop (); /* This doesn't work! */
      break;
    }

  default:
    return DefWindowProc(hwnd, msg, wParam, lParam);
  }
  return 0;
}

现在,这是我不了解的部分-QuitMainLoop没有开始,也没有返回(我尝试了调试器,它表明没有调用Quit函数,并且该调用之后的任何行没有执行)。 因此,实际上,我的程序在该调用之后卡住了。

但是,将对自定义退出函数的调用替换为对PostQuitMessage的直接调用是PostQuitMessage

解决该问题(并能够调用虚拟函数)的任何解释和/或方法将被高度推荐。

编辑:添加了确切的代码

由于您尚未发布完整的代码,我们可以运行该代码来重现该问题,我们不得不猜测。

我看到的对QuitMainLoop()的调用失败的唯一方法是,如果WindowsBackend::instance损坏了。 在调用QuitMainLoop()之前,是否QuitMainLoop()其错误地销毁? 也许有内存损坏?

我将在调试器的反汇编视图下查看它。 那应该告诉您出了什么问题,然后您需要按照提示找出原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM