2009-03-18 7 views
1

Cela se produit au moins avec wxWidgets 2.8.9 et 2.8.10 sous Windows XP, ne pas tester sur d'autres patforms:wxWidgets: Crash avec wxGLCanvas/wxGLContext

J'ai deux dll, a.dll et b.dll , qui sont des plugins VST fonctionnant dans un séquenceur hôte. Ils utilisent wxWidgets et OpenGL. Lors de l'initialisation, j'appelle cela dans les deux plug-ins (mais avec différents m_width et 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(); 
} 

Cela fonctionne bien aussi longtemps que je ne a.dll ouvert ou b.dll. En outre, l'ouverture de plusieurs instances de a.dll ou b.dll fonctionne bien. Cependant, dès que je l'ouvre a.dll et b.dll en même temps, le séquenceur hôte arrête immédiatement après avoir appelé cette ligne (même pendant le débogage):

m_canvas->SetCurrent(*m_context); 

C'est ce que je peux voir sur la sortie:

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

Répondre

2

Les messages d'erreur dans la sortie semblent indiquer que vous avez lié statiquement wxWidgets dans les deux plugins. Cela fonctionnera tant que vous chargez seulement un plugin, même plusieurs fois, car la librairie wxWidgets ne sera initialisée qu'une seule fois.

Si vous essayez cependant de charger le second plugin alors que le premier est encore chargé, alors l'initialisation de wxWidgets dans le second plugin échouera, et par conséquent il y aura un crash tôt ou tard.

Vous devez lier dynamiquement les deux plugins avec wxWidgets. Google pour wxWidgets et plugins/modules chargeables, et vous devriez être en mesure de trouver plus d'informations sur ce problème.