2012-10-09 54 views
16

我想使用Qt GUI库作为VST插件的用户界面。 VST插件是Windows上的DLL。主机应用程序调用DLL上的各种函数,包括诸如openGUI()之类的东西。DLL中的Qt GUI环境(VST插件)

我想知道如何从DLL中使用Qt GUI;我已经做了一些研究,看看可能的选择,但我不完全确定这些限制。

主要的问题是在哪里创建QApplication对象并调用exec()(它是一个函数,直到应用程序退出才会返回)。

我已经看了看this post给出的解决方案,但经过进一步的阅读它会出现在这个解决方案将不能在Mac OS X上运行,如可可更严格的关于特定线程一个GUI上都可以运行。这真的有点破解。

我也看到了this solution,但这依赖于QMfcAppQWinWindow,它们似乎不再是Qt库的一部分。

对于我的DLL来生成一个新的应用程序本身的唯一方法是绕过这个吗?大概我可以开始一个与以QProcess通话,并使用一些共享内存的GUI应用程序,我的VST DLL之间共享?有没有人遇到这种类型的问题?我是否会因此而走上糟糕的路线,还是有一些我还没有想到的东西?

更新

进一步研究后,我所遇到的QAbstractEventDispatcher类。我已经看到this post似乎说可以从你自己的(我的插件的主机)事件循环调用QApplication::processEvents()而不是调用QApplication::exec()。有没有人试过这样做?

+0

我在windows上完成了它(第一个解决方案与单独的线程)。这是非常困难的,因为我们需要从禁止的dllmain中激发一个单独的线程。 QMfcApp从来不是Qt的一部分,而是所谓的“解决方案”。你可以在这里找到http://qt.gitorious.org/qt-solutions/qt-solutions/trees/master/qtwinmigrate。祝你好运! –

回答

5

看起来你的实际问题是在mac上使用Qt作为VST插件,因为它被报告在Windows上工作 - 请参见herefull source tree)和here

在mac in the Qt forums上有使用Qt for VST插件的成功报告,但另一方面在同一问题上有open bug

我知道它没有回答你的问题,但我会建议与其他更适合VST插件的UI库,如JUCEWDL

+0

我想知道哪个其他库,也许你提到的两个,实际上是解决了这个问题。我目前正在研究哪种跨平台的gui库用于类似的插件。如果有人有一个关于使用特定图书馆的可行性的链接,我很乐意听到它。 – John

2

从VST DLL执行Qt进程,然后使用IPC在它们之间共享内存(或使用消息传递等)。

0

Microsoft发布了一个有趣的文档:"Best Practices for Creating DLLs" 它推荐开发一个特定的API来在DllMain之外初始化,启动,停止,释放该DLL。

+0

你不允许在dll main中启动一个线程 - 事实上,如果你等待线程在DLL_PROCESS_DETACH中停止,它会阻止endlesly –

+0

“创建DLL的最佳实践”文档(http://msdn.microsoft.com /en-us/windows/hardware/gg487379.aspx)说:“如果你不与其他线程同步,创建一个线程就可以工作,但是风险很大。” – Aubin

+0

可能工作不是很好,不是吗?我不熟悉VST插件API,但我认为有一种激活 - 例如init函数或构造函数调用。为什么不在那里启动Qt线程? –

1

你要打倒这种不好的路线?不一定,如果你正在开发一个免费的VST插件。然而,就像我喜欢Qt一般的软件开发一样,它并不特别适合VST开发。它的授权是这样的,你不能静态链接一个DLL和它的库用于商业用途,除非你付钱;而且非常昂贵。当他们创建LGPL时,它使得它可以将所有的依赖关系放入目标程序或DLL目录的独立商业程序中,这些依赖关系可以轻松地运行到十几个DLL中,并且可以运行并且可以销售它商业。

VST用户习惯于将DLL移动到周围,以便移动效果;并且他们不能只有一个人在LGPL下移动。乱抛垃圾的目录有很多额外的DLL要扫描,使得扫描过程变慢。在VST插件文件夹中存在大量依赖关系对于商业插件而言并不适用于其他商业应用程序,因为您无法在单个DLL中生成插件并将其与Qt库静态链接而无需付费很多Qt,或者使它成为GPL或者其他的。