- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个使用 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
的直接调用是可行的。
任何解释和/或解决此问题(并能够调用虚函数)的方法都将受到高度重视。
编辑:添加了确切的代码
最佳答案
由于您没有发布我们可以运行以重现我们必须猜测的问题的完整代码。
我能看到调用 QuitMainLoop()
失败的唯一方法是 WindowsBackend::instance
以某种方式损坏。你是不是在调用QuitMainLoop()
之前误销毁了它?是否存在内存损坏?
我会在调试器的反汇编 View 下查看它。这应该会告诉您出了什么问题,然后您需要根据线索找出原因。
关于c++ - 从 WndProc 调用 c++ 虚函数失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7294032/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!