wxWidgets:使用wxGLCanvas / wxGLContext崩溃

时间:2009-03-18 15:18:07

标签: c++ wxwidgets

至少在Windows XP上使用wxWidgets 2.8.9和2.8.10,没有在其他模式上测试时发生这种情况:

我有两个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).
....

1 个答案:

答案 0 :(得分:2)

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

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

您应该使用wxWidgets动态链接两个插件。谷歌的wxWidgets和插件/可加载模块,你应该能够找到有关这个问题的更多信息。