2010-06-25 1 views
5

В моем проекте у меня есть набор DLL, которые я хочу загрузить с задержкой, т. Е. При первом использовании, а не при запуске процесса. Это означает, что я хочу использовать/DELAYLOAD флаг компоновщика MSVC (см. [1] для получения дополнительных пояснений) для определенных DLL (а не Qt). Причина в том, что некоторые пользователи испытывают сбои во время инициализации DLL (которые мы не можем воспроизвести). У прежней версии программного обеспечения, отличной от Qt, не было этой проблемы, но она использовала задержанную загрузку, так что это могло бы иметь значение.Задержка загрузки DLL возможна при использовании QMake?

Используя QMake, я не нашел способ отложить загрузку на работу. Кто-нибудь знает, как передать/DELAYLOAD в компоновщик msvc, используя функции qmake при обходе qmake?

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

ответ

3

Modify .pro файл:

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

Я использую Qt5.1.1 с MSVC 2012, но в соответствии с MS это должно работать с VC2005 и выше.

1

Вы должны быть в состоянии просто добавить его к одной из переменных, таких как QMAKE_LFLAGS QMAKE_LFLAGS_RELEASE. Это будет в файле проекта, который отвечает за привязку вашей dll к вашему приложению (предположительно тот, который создает окончательное приложение).

Что-то вроде

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

должен работать.

+0

Хмм, возможно, попробую, когда я буду работать над этим проектом в следующий раз. Я пробовал все виды этих флагов, но я попытался «ввести» также имена DLL, которые я хотел загрузить с задержкой IIRC. На самом деле я хочу, чтобы загружались только определенные DLLS-файлы таким образом, но, вероятно, не повредить их применение ко всем из них. –

+0

@Frank: Я обновил ответ, чтобы добавить отсутствующее имя dll. Глядя на документы MSDN, похоже, что это имя требуется, поэтому вам придется делать это индивидуально для каждого. – Troubadour

+0

Думаю, я попробовал это. Ну, я попробую еще раз (проект клиента я не работаю непрерывно). –