簡體   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