2010-06-25 10 views
5

En mi proyecto, tengo un conjunto de archivos DLL que deseo cargar con retraso, es decir, en el primer uso en lugar de en el inicio del proceso. Eso significa que quiero usar el indicador/DELAYLOAD del enlazador MSVC (ver [1] para más explicaciones) para ciertos archivos DLL (no Qt en sí). La razón es que algunos usuarios experimentan bloqueos durante la inicialización de la DLL (que no podemos reproducir). Una versión anterior del software no Qt no tenía ese problema, pero usaba carga diferida, por lo que podría marcar la diferencia.retraso en la carga de DLL al usar QMake?

Utilizando QMake, no encontré ninguna forma de que la carga retrasada fuera a funcionar. ¿Alguien sabe cómo pasar/DELAYLOAD al enlazador de msvc, usando las funciones de qmake al omitir qmake?

[1] http://www.codeproject.com/KB/DLL/Delay_Loading_Dll.aspx

Respuesta

3

Modificar .pro archivo:

## Make delayed load possible. If your project is itself a DLL which uses xxx.dll, you 
## also need to include this line in the applications that use your DLL. 
LIBS += DelayImp.lib 

## Specify that xxx.dll loading needs to be delayed 
win32:CONFIG(release, debug|release) { 
    QMAKE_LFLAGS_RELEASE += /DELAYLOAD:xxx.dll 
} else:win32:CONFIG(debug, debug|release) { 
    QMAKE_LFLAGS_DEBUG += /DELAYLOAD:xxx.dll 
} 

utilizo Qt5.1.1 con MSVC 2012, pero según MS esto debería funcionar desde y hasta VC2005.

1

Usted debe ser capaz de simplemente añadirlo a una de las variables QMAKE_LFLAGS como QMAKE_LFLAGS_RELEASE. Esto estaría en el archivo de proyecto que es responsable de vincular su dll a su aplicación (presumiblemente la que crea la aplicación final).

Algo así como

win32 { 
    QMAKE_LFLAGS_RELEASE+=/DELAYLOAD:MyDll.dll 
} 

debería funcionar.

+0

Hmm, podría intentarlo cuando trabaje en ese proyecto la próxima vez. Probé todo tipo de esas banderas, pero traté de "inyectar" también los nombres de las DLL que quería cargar IIRC con carga. En realidad, solo quiero que se cargue DLLS específico de esa manera, pero probablemente no esté mal aplicarlo a todos ellos. –

+0

@Frank: actualicé la respuesta para agregar el nombre de dll faltante. Al mirar los documentos de MSDN, parece que se requiere el nombre, por lo que tendría que hacerlo individualmente para cada uno. – Troubadour

+0

Creo que lo intenté. Bueno, lo intentaré de nuevo (proyecto de cliente en el que no trabajo continuamente). –

Cuestiones relacionadas