Qt GUI в DLL (плагин VST)
Я хотел бы использовать библиотеку Qt GUI в качестве пользовательского интерфейса для плагина VST. Плагин VST - это DLL на окнах. Приложение-хозяин вызывает различные функции в DLL, включая такие вещи, как openGUI()
.
Я хочу знать, как использовать Qt GUI из DLL; Я провел некоторое исследование, чтобы посмотреть возможные варианты, но я не совсем уверен в ограничениях.
Основная проблема заключается в создании объекта QApplication
и вызова exec()
на нем (который является функцией, которая не возвращается, пока приложение не завершит работу).
Я рассмотрел решение, данное в этом сообщении, но после дальнейшего чтения оказалось, что это решение не будет работать в Mac OS X, так как Cocoa более ограничительным в отношении конкретного потока, на котором может работать GUI. Это немного взломать.
Я также видел это решение, но полагается на QMfcApp
и QWinWindow
, которые больше не являются частью библиотеки Qt.
Это единственный способ обойти эту DLL для самого нового приложения? Предположительно, я мог бы начать с вызова QProcess
и использовать некоторую разделяемую память для совместного использования между графическим интерфейсом и моей VST DLL? Кто-нибудь сталкивался с этой проблемой? Я иду по плохому маршруту с этим или есть то, о чем я еще не думал?
Обновление
После дальнейших исследований я столкнулся с классом QAbstractEventDispatcher
. Я видел этот пост, который, кажется, позволяет называть QApplication::processEvents()
из вашего собственного (хоста моего плагина) цикла событий вместо вызов QApplication::exec()
. Кто-нибудь пытался это сделать?
Ответы
Ответ 1
Кажется, что ваша фактическая проблема заключается в использовании Qt для плагина VST на Mac, поскольку, как сообщается, он работает в Windows - см. здесь (полное дерево источников) и здесь.
Там есть успешный отчет об использовании Qt для плагинов VST на mac на форумах Qt, но с другой стороны там открыть ошибку по той же проблеме.
Я знаю, что он не отвечает на ваш вопрос, но я бы посоветовал пойти с другими библиотеками пользовательского интерфейса, которые лучше подходят для плагинов VST, таких как JUCE и WDL.
Ответ 2
От VST DLL выполните Qt-процесс, а затем используйте IPC для обмена памятью между ними (или используйте передачу сообщений и т.д.).
Ответ 3
Вы идете по этому плохому маршруту? Не обязательно, если вы разрабатываете бесплатный плагин VST. Однако, насколько мне нравится Qt для общей разработки программного обеспечения, он не особенно подходит для разработки VST. Его лицензирование таково, что вы не можете статически связать DLL с ее библиотеками для коммерческого использования, если только вы не заплатите за это; и это довольно дорого Когда они сделали это LGPL, это сделало так, чтобы вы могли поместить все свои зависимости, которые легко запускаются в более чем дюжину DLL, для автономных коммерческих программ в целевую программу или каталог DLL, и он будет работать, и вы сможете продать его коммерчески; без покупки лицензии.
Пользователи VST привыкли свободно перемещать DLL, чтобы перемещать эффекты; и у них не может быть только одного, чтобы передвигаться под LGPL. Засорение каталогов с большим количеством дополнительных DLL для сканирования замедляет процесс сканирования. Наличие большого количества зависимостей в папке с вашим плагином VST будет работать не очень хорошо для коммерческих плагинов, как для других коммерческих приложений, потому что вы не можете создать плагин в одной DLL и статически связать его с библиотеками Qt, не платя много для Qt, или делает его GPL или что-то подобное.
Изменение: При этом, он будет работать нормально для VST плагинов с открытым исходным кодом. Одним из аргументов против этого было то, что Qt сравнивает строки для своих сигналов и слотов. Новый способ обработки сигналов и слотов с использованием новых перегрузок соединения НЕ полагается на строки.
В локальной студии звукозаписи, при установке плагинов Waves, я заметил, что в каталоге {Каталог установки Waves}/Application есть папки WavesQtLibs, в которых есть библиотеки Qt. Похоже, что они используют Qt для своих приложений, но если они используют их для своих плагинов, они либо статически связывают, либо не используют их. Поскольку Waves поддерживает свои приложения и плагины для нескольких платформ, я понимаю, насколько привлекательным для них будет Qt. Вероятно, они могли бы позволить себе лицензии на разработку Qt. Похоже, что они используют Qt с DLL для своих приложений, что упростит перенос между операционными системами. Я не знаю, есть ли у них необходимое уведомление для использования LGPL или нет. Я не знаю, используют ли они статически связанные Qt для своих плагинов, используют ли они инфраструктуру JUCE (которая, хотя и стоит немного дороже, также не выдавливает ограниченную базу пользователей по цене), или что-то еще.
Ответ 4
Microsoft выпустила интересный документ: "Лучшие практики для создания DLL"
Он рекомендует разрабатывать определенный API для инициализации, запуска, остановки, выпуска DLL, вне DllMain.