序文
DLLベースのソフトウェアモジュールであり、VSTをサポートするホストアプリケーションによってロードされるVSTプラグインを開発しています。VSTプラグインを開くには、ホストアプリケーションがVST-DLLをロードし、プラグインがGUIを描画するために使用できるネイティブウィンドウハンドルを提供しながら、プラグインの適切な関数を呼び出します。元のVSTGUIコードをwxWidgets-Frameworkに移植し、すべてのプラグインをwxMSWとwxMacで実行できるようになりましたが、プラグインを開閉する正しい方法を見つけるためにwxMSWで問題が発生し、これがwxMSWのみの問題。
問題
VSTホストアプリケーションを使用している場合は、VSTプラグインの1つの複数のインスタンスを問題なく開いたり閉じたりできます。最初のVSTプラグイン以外に別のVSTプラグインを開き、最初のVSTプラグインのすべてのインスタンスを閉じるとすぐに、wxEventHandlerr :: ProcessEvent関数内でアプリケーションがクラッシュし、wxTheAppオブジェクトが通知されます。 wxTheApp-> FilterEventの実行中は無効になります(以下を参照)。したがって、最初のプラグインのすべてのインスタンスを閉じた後にwxTheAppオブジェクトが削除され、2番目のプラグインで使用できなくなったようです。
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プラグインは、C-RuntimeおよびwxWidgetsライブラリに対して動的にリンクされています。wxWidgetsフォーラムに関しては、これがソフトウェアの複数のインスタンスを並べて実行するための最良の方法であるように思われました。
2.)各VSTプラグインのDllMainは次のように定義されています。
// 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)
質問
C-RuntimeおよびwxWidgetsライブラリに対して動的にリンクされている異なるVSTプラグイン(DLLモジュール)の複数のインスタンスがある場合、この動作をそれぞれ防ぐにはどうすればよいですか?wxTheAppオブジェクトを適切に処理するにはどうすればよいですか?
最高のリーガード、ステフェン