2012-10-09 38 views
16

Me gustaría utilizar la biblioteca Qt GUI como interfaz de usuario para un complemento VST. Un complemento VST es una DLL en Windows. Una aplicación de host llama a varias funciones en el archivo DLL, incluidas cosas como openGUI().Qt entorno GUI en un archivo DLL (complemento VST)

Quiero saber cómo usar Qt GUI desde una DLL; Hice algunas investigaciones para ver las posibles opciones, pero no estoy completamente seguro de las limitaciones.

El problema principal es dónde crear el objeto QApplication y llamar al exec() (que es una función que no se devuelve hasta que se cierra la aplicación).

He examinado la solución que figura en this post, pero después de leerlo más, parece que esta solución no funcionará en Mac OS X, ya que Cocoa es más restrictivo sobre el hilo en particular en que se puede ejecutar una GUI. Es un poco un truco realmente.

También he visto this solution, pero eso se basa en QMfcApp y QWinWindow que ya no parecen ser parte de la biblioteca de Qt.

¿Es la única forma de evitar que mi DLL genere una nueva aplicación? ¿Presumiblemente podría comenzar uno con una llamada al QProcess y usar algo de memoria compartida para compartir entre la aplicación GUI y mi DLL VST? ¿Alguien ha encontrado este tipo de problema? ¿Voy por una mala ruta con esto o hay algo en lo que no he pensado todavía?

actualización

Después de más investigaciones que han llegado a través de la clase QAbstractEventDispatcher. He visto this post que parece decir que es posible llamar al QApplication::processEvents() desde su propio bucle de eventos (el host de mi complemento) en lugar de llamar al QApplication::exec(). ¿Alguien ha intentado hacer esto?

+0

Lo he hecho en Windows (la primera solución con el hilo separado). Fue realmente difícil ya que necesitábamos arrancar un hilo separado de algo que está prohibido. QMfcApp nunca ha sido parte de Qt, sino más bien una llamada "solución". Lo encontrará aquí http://qt.gitorious.org/qt-solutions/qt-solutions/trees/master/qtwinmigrate. ¡Buena suerte! –

Respuesta

5

Parece que su problema real es usar Qt para un complemento VST en mac, ya que se informó que funciona en Windows - vea here (full source tree) y here.

Hay un informe exitoso de usar Qt para plugins VST en mac in the Qt forums, pero por otro lado hay un open bug en el mismo problema.

Sé que no responde su pregunta, pero le sugiero que vaya con otras bibliotecas de IU que son más adecuadas para los complementos VST, como JUCE y WDL.

+0

Me pregunto qué otra biblioteca, tal vez las dos que mencionas, realmente aborda este problema. Actualmente estoy investigando qué biblioteca gui multiplataforma usar para un tipo similar de complemento. Si alguien tiene un enlace donde se habla de la posibilidad de usar una biblioteca en particular, me encantaría escucharlo. – John

2

Desde VST DLL ejecute el proceso Qt y luego use el IPC para compartir memoria entre ellos (o use el mensaje que pasa, etc.).

0

Microsoft ha publicado un documento interesante: "Best Practices for Creating DLLs" Se recomienda desarrollar una API específica para inicializar, iniciar, detener, liberar la DLL, fuera de DllMain.

+0

No tiene permiso para iniciar un hilo en dll main - De hecho, bloqueará definitivamente si espera a que el hilo se detenga en DLL_PROCESS_DETACH –

+0

El documento "Mejores prácticas para crear archivos DLL" (http://msdn.microsoft.com /en-us/windows/hardware/gg487379.aspx) dice "Crear un hilo puede funcionar si no se sincroniza con otros hilos, pero es arriesgado". – Aubin

+0

puede funcionar no es realmente bueno ¿no? No estoy familiarizado con una API de complemento de VST, pero supongo que hay un tipo de activación, por ejemplo, una función de inicio o una llamada de constructor. ¿Por qué no encender el hilo Qt allí? –

1

¿Vas por una mala ruta con esto? No necesariamente, si está desarrollando un plugin VST gratuito. Sin embargo, tanto como me gusta Qt para el desarrollo general de software, no es especialmente adecuado para el desarrollo de VST. Su licencia es tal que no puede vincular estáticamente un archivo DLL con sus bibliotecas para uso comercial, a menos que pague por ello; y es bastante caro Cuando lo hicieron LGPL, lo hizo para que pueda poner todas sus dependencias, que fácilmente se ejecuta en más de una docena de DLL, para programas comerciales independientes en un programa de destino o directorio DLL, y se ejecutará y puede venderlo comercialmente.

Los usuarios de VST están acostumbrados a mover las DLL de un lugar a otro para mover los efectos; y no pueden tener solo uno para moverse bajo LGPL. Llenar directorios con muchos archivos DLL adicionales para escanear hace que el proceso de escaneo sea más lento. Tener muchas dependencias en la carpeta con su plugin VST no funcionará muy bien para los complementos comerciales de la misma manera que lo hará con otras aplicaciones comerciales, ya que no puede producir un plugin en una sola DLL y vincularlo estáticamente con las bibliotecas Qt sin pagar mucho para Qt, o hacerlo GPL o algo así.