我正在开发一个使用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
来取代对自定义退出功能的调用有效。
任何解释和/或解决此问题的方法(并且能够调用虚拟函数)都会受到高度关注。
编辑:添加了确切的代码
答案 0 :(得分:1)
由于您还没有发布我们可以运行的完整代码来重现我们必须猜测的问题。
我可以看到调用QuitMainLoop()
失败的唯一方法是WindowsBackend::instance
以某种方式损坏。在致电QuitMainLoop()
之前,你是否错误地将其销毁?是否存在内存损坏?
我会在调试器的反汇编视图下看一下这个。这应该告诉你出了什么问题,然后你需要按照线索找出原因。