PréfaceProblèmes d'utilisation wxWidgets (wxMSW) dans plusieurs instances de DLL
Je développe des plugins VST qui sont des modules logiciels basés sur les DLL et chargé par les applications hôtes VST support. Pour ouvrir un plug-in VST, les applications hôtes chargent la DLL VST et appellent une fonction appropriée du plugin tout en fournissant un handle de fenêtre natif, que le plugin peut utiliser pour dessiner son interface graphique. J'ai réussi à porter mon code original VSTGUI vers le wxWidgets-Framework et maintenant tous mes plugins fonctionnent sous wxMSW et wxMac mais j'ai encore des problèmes sous wxMSW pour trouver une manière correcte d'ouvrir et de fermer les plugins et je ne suis pas sûr que ce soit un problème avec wxMSW uniquement.
Problème
Si j'utilise une application VST-hôte, je peux ouvrir et fermer les instances multiples d'un de mes plugins VST sans aucun problème. Dès que j'ouvre un autre de mes plugins VST en plus de mon premier plugin VST puis que je ferme toutes les instances de mon premier plugin VST, l'application se bloque après un court laps de temps dans la fonction wxEventHandlerr :: ProcessEvent me disant que l'objet wxTheApp n'est plus valide lors de l'exécution de wxTheApp-> FilterEvent (voir ci-dessous). Il semble donc que les objets wxTheApp ont été supprimés après la fermeture de toutes les instances du premier plugin et ne sont plus disponibles pour le second plugin.
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
}
....
}
Préalables
1.) Tous Mes plugins VST une dynamique Linked contre le C-Runtime et les bibliothèques wxWidgets. En ce qui concerne le forum wxWidgets , cela semblait être le meilleur moyen d'exécuter plusieurs instances du logiciel côte à côte.
2.) Le DllMain de chaque VST plug-in est défini comme suit:
// 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)
Question
Comment puis-je empêcher ce comportement, respectivement comment puis-je gérer correctement l'objet wxTheApp si je avoir plusieurs instances de différents plug-ins VST (modules DLL), qui sont dynamiquement liés aux bibliothèques C-Runtime et wxWidgets?
Les meilleurs reagards, Steffen
Puisque vous n'avez pas encore de réponse, je vous suggère de demander plus à kvraudio, où il y a beaucoup de programmeurs VST. http://www.kvraudio.com/forum/viewforum.php?f=33 – Nosredna