2010-06-25 8 views
5

In meinem Projekt habe ich eine Reihe von DLLs, die ich verzögert laden möchte, d. H. Bei der ersten Verwendung statt beim Prozessstart. Das bedeutet, ich möchte/DELAYLOAD-Flag des MSVC Linker (siehe [1] für weitere Erklärung) für bestimmte DLLs (nicht Qt selbst) verwenden. Der Grund ist, dass einige Benutzer bei der DLL-Initialisierung (die wir nicht reproduzieren können) Abstürze erleben. Eine frühere Nicht-Qt-Version der Software hatte dieses Problem nicht, aber sie verwendete verzögertes Laden, so dass es einen Unterschied machen könnte.verzögertes DLL-Laden bei Verwendung von QMake möglich?

Mit QMake habe ich keine Möglichkeit gefunden, verzögerte Ladevorgänge zu erhalten. Kann jemand DELAYLOAD an den msvc-Linker weitergeben, indem er qmake-Funktionen nutzt, um qmake zu umgehen?

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

Antwort

3

Ändern .proDatei:

## 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 
} 

Ich benutze Qt5.1.1 mit MSVC 2012, aber nach MS sollte dies von VC2005 und bis arbeiten.

1

Sie sollten in der Lage sein, nur um es wie QMAKE_LFLAGS_RELEASE einem der QMAKE_LFLAGS Variablen hinzuzufügen. Dies wäre in der Projektdatei, die für die Verknüpfung Ihrer DLL mit Ihrer Anwendung verantwortlich ist (vermutlich diejenige, die die endgültige Anwendung erstellt).

So etwas wie

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

funktionieren sollte.

+0

Hmm, könnte das versuchen, wenn ich das nächste Mal an diesem Projekt arbeite. Ich habe alle möglichen dieser Flags ausprobiert, aber ich habe versucht, auch die Namen der DLLs zu "injizieren", die ich mit dem verzögerten IIRC geladen haben wollte. Eigentlich möchte ich nur bestimmte DLLs auf diese Weise laden, aber es tut wahrscheinlich nicht weh, sie auf alle anzuwenden. –

+0

@Frank: Ich habe die Antwort aktualisiert, um den fehlenden DLL-Namen hinzuzufügen. Wenn Sie sich die MSDN-Dokumente ansehen, sieht es so aus, als wäre der Name erforderlich. Sie müssten das also für jeden einzelnen tun. – Troubadour

+0

Ich denke, dass ich das versucht habe. Nun, ich werde es nochmal versuchen (Kundenprojekt arbeite ich nicht kontinuierlich). –

Verwandte Themen