前言
我正在开发 VST 插件,它们是基于 DLL 的软件模块,由支持 VST 的主机应用程序加载。要打开 VST 插件,主机应用程序会加载 VST-DLL 并调用插件的适当函数,同时提供本机窗口句柄,插件可以使用它来绘制它的 GUI。我设法将我的原始 VSTGUI 代码移植到 wxWidgets-Framework,现在我的所有插件都在 wxMSW 和 wxMac 下运行,但我在 wxMSW 下仍然遇到问题,无法找到打开和关闭插件的正确方法,我不确定这是否是wxMSW-only 问题。
问题
如果我使用任何 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 插件都动态链接到 C-Runtime 和 wxWidgets 库。关于 wxWidgets 论坛,这似乎是并行运行多个软件实例的最佳方式。
2.) 每个 VST-Plugin 的 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)
问题
如果我有多个不同 VST 插件(DLL 模块)的实例,这些实例与 C-Runtime 和 wxWidgets 库动态链接,我该如何分别防止这种行为?
最好的问候,史蒂芬