VorwortProbleme wxWidgets (wxMSW) innerhalb mehrerer DLL-Instanzen
Ich entwickle VST-Plug-in, die DLL-basierten Software-Module geladen und von VST-Unterstützung Host-Anwendungen. Um ein VST-Plugin zu öffnen, laden die Host-Anwendungen die VST-DLL und rufen eine entsprechende Funktion des Plugins auf, während sie ein natives Fenster-Handle bereitstellen, mit dem das Plugin seine GUI zeichnen kann. Ich habe es geschafft, meinen ursprünglichen VSTGUI Code in das wxWidgets-Framework zu portieren und jetzt laufen alle meine Plugins unter wxMSW und wxMac, aber ich habe immer noch Probleme unter wxMSW, um einen korrekten Weg zum Öffnen und Schließen der Plugins zu finden und ich bin nicht sicher, ob dies der Fall ist ein WxMSW-only-Problem
Problem
Wenn ich VST-Host-Anwendung verwenden I und in der Nähe mehrere Instanzen eines meiner VST-Plugins ohne Probleme öffnen können. Sobald ich ein anderes meiner VST-Plugins neben meinem ersten VST-Plugin öffne und dann alle Instanzen meines ersten VST-Plugins schließe, stürzt die Anwendung nach kurzer Zeit innerhalb der wxEventHandlerr :: ProcessEvent Funktion ab und meldet mir das wxTheApp-Objekt ist während der Ausführung von wxTheApp-> FilterEvent nicht mehr gültig (siehe unten). So scheint es, dass die wxTheApp-Objekte nach dem Schließen aller Instanzen des ersten Plugins gelöscht wurden und für das zweite Plugin nicht mehr verfügbar sind.
bool wxEvtHandler::ProcessEvent(wxEvent& event)
{
// allow the application to hook into event processing
if (wxTheApp)
{
int rc = wxTheApp->FilterEvent(event);
if (rc != -1)
{
wxASSERT_MSG(rc == 1 || rc == 0,
_T("unexpected wxApp::FilterEvent return value"));
return rc != 0;
}
//else: proceed normally
}
....
}
Voraussetzungen
1.) Alle meine VST-Plugins ein dynamisch gelinkt gegen die C-Runtime und wxWidgets-Bibliotheken. Im Hinblick auf die wxWidgets Forum schien dies der beste Weg, mehrere Instanzen der Software nebeneinander laufen zu lassen.
2.) Die DllMain jede VST-Plugin wie folgt definiert ist:
// WXW
#include "wx/app.h"
#include "wx/defs.h"
#include "wx/gdicmn.h"
#include "wx/image.h"
#ifdef __WXMSW__
#include <windows.h>
#include "wx/msw/winundef.h"
BOOL APIENTRY DllMain
(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
wxInitialize();
::wxInitAllImageHandlers();
break;
}
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
wxUninitialize();
break;
}
return TRUE;
}
#endif // __WXMSW__
class Application : public wxApp {};
IMPLEMENT_APP_NO_MAIN(Application)
Frage
Wie kann ich dieses Verhalten bzw. verhindern, wie kann ich das wxTheApp Objekt, wenn ich richtig behandeln haben mehrere Instanzen von verschiedenen VST-Plugins (DLL-Module), die dynamisch gegen die C-Runtime und WxWidgets Bibliotheken verknüpft sind?
Beste reagards, Steffen
Da Sie eine Antwort noch nicht, ich schlage vor, Sie bei kvraudio fragen über, wo es eine Menge von VST-Programmierer. http://www.kvraudio.com/forum/viewforum.php?f=33 – Nosredna