2010-06-25 23 views
5

Projemde, gecikme yüklemek istediğim bir dizi DLL'im var, yani işlem başlangıcı yerine ilk kullanımda. Bu, MSVC bağlayıcısının/DELAYLOAD işaretini kullanmak istiyorum (daha fazla açıklama için [1] konusuna bakın), belirli DLL'ler için (Qt'nin kendisi değil). Bunun nedeni, bazı kullanıcıların DLL başlatılması sırasında (ki çoğaltamıyoruz) kilitlenme yaşadıklarıdır. Yazılımın eski Qt olmayan bir sürümü bu sorunla karşılaşmadı, ancak gecikmeli yükleme kullandı, böylece fark yaratabilir.gecikmeli DLL yükleme mümkün mü?

QMake'i kullanarak, gecikmeli yüklemeyi işe yaramayacak bir yol bulamadım. Qmake'yi atlayarak qmake özelliklerini kullanarak msvc linker'a/DELAYLOAD geçişini bilen var mı?

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

Sadece böyle QMAKE_LFLAGS_RELEASE olarak QMAKE_LFLAGS değişkenlerden biri eklemek için yapabilmelidir

cevap

3

değiştirmek .pro dosyası:

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

Ben MSVC 2012 ile Qt5.1.1 kullanıyorum ancak MS'e göre bu VC2005 gelen ve yukarı çalışması gerekir.

1

. Bu, dll'nizi uygulamanıza (muhtemelen son uygulamayı oluşturan) bağlamanızın sorumlusu olan proje dosyasında olacaktır. çalışması gerekir

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

gibi

şey.

+0

Hmm, bir dahaki sefere bu projede çalışırken bunu deneyebilir. Bu bayrakların her türlü denedim, ancak gecikmiş IIRC yüklemek istedim DLLs isimleri de "enjekte" denedim. Aslında sadece belirli DLL'lerin bu şekilde yüklenmesini istiyorum, ama muhtemelen hepsini uygulamak için zarar vermez. –

+0

@Frank: Eksik dll adını eklemek için cevabı güncelledim. MSDN belgelerine baktığımızda ismin gerekli olduğu anlaşılıyor, dolayısıyla her biri için ayrı ayrı yapmanız gerekecek. – Troubadour

+0

Sanırım bunu denedim. Eh, tekrar deneyeceğim (sürekli olarak çalışmadığım müşteri projesi). –