ПредисловиеПроблемы с использованием WxWidgets (wxMSW) в течение нескольких экземпляров DLL
Я занимаюсь разработкой VST-плагинов, которые DLL на основе программных модулей и загружаются VST-поддержки хост-приложения. Чтобы открыть VST-плагин, хост-приложения загружают VST-DLL и вызывают соответствующую функцию плагина, предоставляя собственный дескриптор окна, который плагин может использовать для рисования его графического интерфейса. Мне удалось перенести мой оригинальный код VSTGUI в wxWidgets-Framework, и теперь все мои плагины работают под wxMSW и wxMac, но у меня все еще есть проблемы с wxMSW, чтобы найти правильный способ открытия и закрытия плагинов, и я не уверен, что это проблема только с wxMSW.
Проблема
Если я использую любое приложение VST-хост можно открывать и закрывать несколько экземпляров одного из моих VST-плагинов без каких-либо проблем. Как только я открою еще один из моих VST-плагинов, помимо моего первого VST-плагина, а затем закрою все экземпляры моего первого VST-плагина, приложение сработает после короткого промежутка времени в функции wxEventHandlerr :: ProcessEvent, сообщив мне, что объект wxTheApp больше не действует во время выполнения wxTheApp-> FilterEvent (см. ниже). Похоже, что объекты wxTheApp были удалены после закрытия всех экземпляров первого плагина и больше не доступны для второго плагина.
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
}
....
}
Предпосылками
1.) Все мои VST-плагины динамически связанные против С-Время воспроизведения и библиотеки WxWidgets. Что касается форума wxWidgets , это, по-видимому, лучший способ запуска нескольких экземпляров программного обеспечения бок о бок.
2.) DllMain каждого VST-плагин определяется следующим образом:
// 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)
Вопрос
Как я могу предотвратить такое поведение, соответственно, как я могу правильно обрабатывать объект wxTheApp, если я имеют несколько экземпляров различных VST-плагинов (DLL-модулей), которые динамически связаны с библиотеками C-Runtime и wxWidgets?
Лучшие reagards, Штеффен
Поскольку у вас нет ответа еще, я предлагаю вам спросить у более kvraudio, где есть много VST программистов. http://www.kvraudio.com/forum/viewforum.php?f=33 – Nosredna