[英]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.