2009-03-18 7 views
1

Dies geschieht zumindest mit wxWidgets 2.8.9 und 2.8.10 unter Windows XP, nicht auf andere patforms testen:WxWidgets: Crash mit wxGLCanvas/wxGLContext

Ich habe zwei DLLs, a.dll und b.dll Dies sind VST-Plugins, die in einem Host-Sequencer ausgeführt werden. Sie verwenden wxWidgets und OpenGL. Bei der Initialisierung, nenne ich dies in beiden Plugins (aber mit unterschiedlichen m_width und 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(); 
} 

Diese Ordnung, solange ich nur offen a.dll oder b.dll funktioniert. Das Öffnen mehrerer Instanzen von a.dll oder b.dll funktioniert auch einwandfrei. Doch sobald ich a.dll und b.dll zugleich geöffnet, schaltet sich der Host-Sequenzer sofort nach unten, nachdem diese Zeile Aufruf (auch während des Debuggens):

m_canvas->SetCurrent(*m_context); 

Das ist, was ich auf der sehen Ausgang:

"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). 
.... 

Antwort

2

die Fehlermeldungen in der Ausgabe erscheint, dass Sie wxWidgets statisch in beiden Plugins verbunden, um anzuzeigen, haben. Dies funktioniert, solange Sie nur ein Plugin laden, sogar mehrfach, da die wxWidgets-Bibliothek dann nur einmal initialisiert wird.

Wenn Sie jedoch versuchen, das zweite Plugin zu laden, während das erste noch geladen ist, dann wird die Initialisierung von wxWidgets im zweiten Plugin fehlschlagen, und folglich wird früher oder später ein Absturz stattfinden.

Sie sollten beide Plugins dynamisch mit wxWidgets verbinden. Google für wxWidgets und Plugins/ladbare Module, und Sie sollten in der Lage sein, weitere Informationen zu diesem Problem zu finden.