2012-10-09 116 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或者其他的。