wxWidgets: сбой с помощью wxGLCanvas / wxGLContext - PullRequest
1 голос
/ 18 марта 2009

Это происходит, по крайней мере, с wxWidgets 2.8.9 и 2.8.10 на Windows XP, не проверял на других паттернах:

У меня есть два 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 Ответ

2 голосов
/ 19 марта 2009

Сообщения об ошибках в выводе указывают на то, что вы статически связали wxWidgets с обоими плагинами. Это будет работать до тех пор, пока вы загружаете только один плагин, даже несколько раз, поскольку библиотека wxWidgets будет инициализирована только один раз.

Однако если вы попытаетесь загрузить второй плагин, пока первый еще загружен, то инициализация wxWidgets во втором плагине не удастся, и, следовательно, рано или поздно произойдет сбой.

Вы должны динамически связать оба плагина с wxWidgets. Google для wxWidgets и плагинов / загружаемых модулей, и вы сможете найти больше информации по этой проблеме.

...