【问题标题】:wxWidgets: Crash with wxGLCanvas/wxGLContextwxWidgets:使用 wxGLCanvas/wxGLContext 崩溃
【发布时间】:2009-03-18 15:18:06
【问题描述】:

这至少发生在 Windows XP 上的 wxWidgets 2.8.9 和 2.8.10 上,没有在其他 patforms 上测试:

我有两个 dll,a.dll 和 b.dll,它们是在主机定序器中运行的 VST 插件。他们使用 wxWidgets 和 OpenGL。在初始化时,我在两个插件中都调用它(但 m_width 和 m_height 不同):

MyControl(..)
{
    ..
    m_canvas = new wxGLCanvas(this, wxID_ANY, 0, wxPoint(0, 0), wxSize(m_width, m_height));
    m_context = new wxGLContext(m_canvas);
    ..
    m_canvas->SetCurrent(*m_context);
}

void MyControl::onPaint(wxPaintEvent& event)
{
    m_canvas->SetCurrent(*m_context);
    wxPaintDC dc(m_canvas);
    ..
    m_canvas->SwapBuffers();
}

只要我只打开 a.dll 或 b.dll,它就可以正常工作。此外,打开 a.dll 或 b.dll 的多个实例也可以正常工作。但是,一旦我同时打开 a.dll 和 b.dll,主机定序器在调用此行后立即关闭(即使在调试时):

m_canvas->SetCurrent(*m_context);

这就是我在输出中看到的:

"host.exe": "D:\something\b.dll" geladen, Symbole wurden geladen.
14:49:02: ..\..\src\msw\app.cpp(364): 'RegisterClass(frame)' failed with error 0x00000582 (klasse ist bereits vorhanden).
14:49:03: ..\..\src\msw\app.cpp(373): 'RegisterClass(no redraw frame)' failed with error 0x00000582 (klasse ist bereits vorhanden).
14:49:03: ..\..\src\msw\app.cpp(383): 'RegisterClass(MDI parent)' failed with error 0x00000582 (klasse ist bereits vorhanden).
14:49:03: ..\..\src\msw\app.cpp(392): 'RegisterClass(no redraw MDI parent frame)' failed with error 0x00000582 (klasse ist bereits vorhanden).
....

【问题讨论】:

    标签: c++ wxwidgets


    【解决方案1】:

    输出中的错误消息似乎表明您已将 wxWidgets 静态链接到两个插件中。只要您只加载一个插件,甚至多次加载,这都会起作用,因为 wxWidgets 库将只被初始化一次。

    如果你在第一个插件还在加载的时候尝试加载第二个插件,那么第二个插件中 wxWidgets 的初始化将会失败,因此迟早会崩溃。

    您应该使用 wxWidgets 动态链接这两个插件。 Google for wxWidgets and plugins / loadable modules,你应该能找到更多关于这个问题的信息。

    【讨论】:

      猜你喜欢
      • 2014-10-12
      • 2022-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多