前言
我正在开发VST插件,这些插件是基于DLL的软件模块,并由支持VST的主机应用程序加载。要打开VST插件,主机应用程序会加载VST-DLL并调用插件的相应功能,同时提供本机窗口句柄,插件可以使用它来绘制GUI。我设法移植了原来的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插件都与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)
问题
如果我有多个实例,如何分别防止此行为如何正确处理wxTheApp对象 不同的VST插件(DLL模块),它们与C-Runtime和wxWidgets库动态链接?
最佳反馈,斯蒂芬
答案 0 :(得分:0)
当wxWidgets应用程序加载了我们的DLL时,我们遇到了类似的问题,使用了用wxWidgets创建的LSP。在调用:: wxInitialize()之前检查NULL == wxTheApp。
伪代码:
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
switch(dwReason) {
case DLL_PROCESS_ATTACH :
if(NULL == wxTheApp) {
::wxInitialize();
}
break;
}
}
另外,我建议尽可能少地在你的DllMain()中做一些事情,例如:如果可能的话,在其他地方移动wxInitAllImageHandlers()。此外,您可能希望跟踪是否调用:: wxInitialize()以配对:: wxUninitialize()
答案 1 :(得分:0)
我遇到了类似的问题但是使用了Acrobat插件。 在将Acrobat插件调整为Acrobat X(10)时,我们必须删除与ADM相关的代码(Acrobat Dialog Manager - 曾经是Acrobat 7,8&amp; 9上的跨平台GUI框架。随Acrobat X删除)并使用不同的GUI框架。
Acrobat SDK附带了使用wxWidgets作为跨平台框架的示例,因此我们采用了这种方式(我们支持MAC和Windows)。 Acrobat的插件体系结构与上面描述的体系结构非常相似:dll(对于Acrobat插件,二进制文件扩展名为* .api),它们由主进程(exe)动态加载,并且它们的函数在文档中被调用,预先定义的顺序。
因为Acrobat wxWidgets示例是用2.8.12编写的,并且由于这是稳定版本,我们决定不使用2.9.x正在进行的版本。
因此,我们将我们的插件(总共3个不同的插件)静态链接到wx2.8.12库,并发现如果安装了3个插件,那么最后加载的两个插件无法正常工作。我的意思是 - 我们的定制wxFrames,wxWindows&amp;属于这两个插件的wxDialogs都搞砸了(就像有人试图用橡皮擦掉它们一样: - ))。
深入挖掘我们将其缩小到第一个插件被加载的事实,初始化wxWidgets而后者没有,即使显式调用wxInitialize()。出了问题......
这里我忘了提到 - 在Acrobat插件中你不能改变DllMain()函数,因此wx的初始化是在“Plugin Init()函数”中完成的。
只是要清楚 - wx库静态链接到* .api文件,因此每个文件都应该有自己的“副本”,而不是相互影响。
使用Google整整2-3天我找到了this帖子 ,建议应用this补丁(仅限2.8倍!!!)。我相信(或希望)2.9.x版本没有遇到这个问题(没有机会检查它)。
BTW - 补丁只是一个非常清晰的文件,所以阅读代码来理解它并保持冷静,它不会造成伤害。
我希望其他人使用wx 2.8.x并遇到同样的问题会发现这一点。
欧米