2009-05-15 27 views
5

Tengo un complemento para una aplicación de otra compañía. Mi complemento utiliza Qt, por lo que necesita las DLL Qt. Mi problema es que todas las versiones de 4.x Qt Dlls se llaman igual, p. : QtCore4.dll. Es muy posible que algún otro complemento u otra aplicación que se haya insertado en la variable de entorno PATH haya puesto Qt dlls en la carpeta de aplicaciones. En ese caso, el complemento no se iniciará ya que está esperando una versión diferente de la DLL.Implementación de Qt DLL en Windows

  • Q1. ¿Cuál es la práctica común sugerida para la implementación de DLL?
  • Q2. ¿Qué pasa si la aplicación host utiliza una versión diferente de Qt. ¿Windows permitiría que la aplicación host y el complemento usen diferentes versiones()?

Gracias!

Respuesta

0

¿No hay forma de elegir vincular estáticamente con Qt?

Desplegaría las DLL en el mismo directorio que mi aplicación/complemento.

Esto no responde a sus otras preocupaciones sin embargo.

+0

Hasta donde yo sé, la vinculación estática solo está permitida para una licencia de Qt comercial. La licencia LGPL requiere que permita a sus clientes 'volver a vincular' su aplicación con una nueva versión de Qt, lo que en la práctica significa: O entregue los archivos fuente o objeto de su aplicación. O distribuya Qt como DLL. – Patrick

0

Al igual que Tim, dijo que debe implementar las DLL en el mismo directorio que la aplicación/complemento que está realizando. Creo que la variable PATH no es el primer lugar en el que su programa buscará el dll QT4, por lo tanto, si lo despliega en la misma carpeta, su aplicación seleccionará la que tiene con su aplicación e ignorará cualquiera que esté en la RUTA.

Q1: En el pasado, parecía que todo el mundo arrojaba sus archivos DLL en la carpeta system32 porque sabían que estaba en el PATH y sabían que el programa podría encontrarlo. Desde el punto de vista de un usuario, me parece muy difícil de limpiar cuando quiero desinstalar algo. Y ahora, con el pequeño precio de almacenamiento, diría que mantenga sus archivos DLL con su aplicación, especialmente si son así, donde podría haber múltiples versiones. Si bien no soy un experto, así es como manejo archivos jar para aplicaciones Java.

P2: Creo que sí. Dependerá de la estructura del directorio de la aplicación y el complemento. Puedes decirle a tu complemento qué versión usar y estoy dispuesto a apostar a que la aplicación ya tiene su versión en un lugar especial.

1

Con las versiones de Windows desde XP (es decir, XP, 2003, Vista, 2008 y Win7), puede usar side-by-side assemblies o DLL redirection. En cualquier caso, básicamente lo que está haciendo es incluir un pequeño archivo de texto que le dice al sistema operativo que necesita usar la versión específica de los DLL que incluyó en el mismo directorio que el ejecutable.

Estas son características menos conocidas, pero realmente pueden salvar su trasero de "DLL Hell".

+0

La caché contigua hace que sea mucho más difícil implementar la aplicación en una red grande. Prefiero las aplicaciones simples, de instalación cero, xcopy-install donde solo tiene que copiar el exe y algunas DLL, o incluso no tiene que copiarlo, sino simplemente dejarlo en una unidad de red. Con el lado-a-lado-caché-DLL se ve obligado a instalar explícitamente la aplicación en cada PC. Y si la próxima versión requiere nuevas DLL, entonces también debe reinstalar la aplicación. – Patrick

3

A1: Mejor práctica: coloque la DLL en el directorio del ejecutable. Primero buscará allí para cargar la DLL. Esta es una práctica común.

A2: Si de alguna manera la aplicación utiliza una versión diferente de Qt y el módulo que está describiendo requiere una versión posterior o específica, podría causar un problema (no funciona, falla, etc.).

Con enlace estático también debería tener en cuenta las restricciones de licencia de Qt. LGPL está contento siempre que la biblioteca se cargue dinámicamente en tiempo de ejecución y se pueda separar de la aplicación. Esto solo aplica si no liberas tu fuente, etc.

Además, su instalador debe configurar el acceso a esos archivos para que estén protegidos de ser sobrescritos por alguna otra aplicación deshonesta.

3

Solo para ayudar a otros con este problema: QT Se garantiza que las DLL sean las mismas (o al menos compatibles con binarios) para todas las versiones de 4.X. (lo mismo para todas las versiones 3.X, etc.), por lo que no habrá ningún problema. Esta es también la razón por la cual no hay un segundo número en el nombramiento de dt dll.

+3

Sin embargo, si la configuración para dos compilaciones de Qt diferentes es diferente, no son compatibles con binarios. – swongu

+0

¿Y qué pasa con la versión de 32 bits y 64 bits de la DLL QT? Entonces tampoco son binarios compatibles. – Patrick

0

Para mayor seguridad, debe estar seguro de que su aplicación utiliza las versiones dll que desea que use. Se garantiza que Windows busque primero en la carpeta de la aplicación. Entonces ahí deberías poner todas tus dependencias binarias.

Si su aplicación no se ejecuta cuando hace doble clic en Explorador, Windows le dirá qué dll necesita. Copia ese dll a la carpeta de la aplicación. Vaya al próximo paso si su aplicación se ejecuta.

Ahora debe eliminar temporalmente (o cambiar el nombre) de la DLL que ha puesto en la carpeta de la aplicación y cada vez que haga doble clic en su aplicación. Si Windows no se queja, encontró el dll en otro lugar. Saca ese dll del entorno PATH (posiblemente temporalmente). Rapid Environment Editor es una herramienta gratuita con variables de entorno de edición que surten efecto de inmediato.

Solo si está seguro de que su aplicación usa los dll en el directorio de la aplicación y no extrae ningún archivo DLL de otro lugar, puede comenzar a editar la variable PATH nuevamente para restaurar la situación anterior.

Cuestiones relacionadas