Безопасно ли смешивать отложенную загрузку DLL и ручной вызов LoadLibraryA? - PullRequest
2 голосов
/ 12 октября 2019

Я собираю программу для Windows.

Я хочу, чтобы он проверил, существует ли foo.dll в системе, и если нет, распечатать сообщение об ошибке и выйти. Безопасно ли делать это так:

  1. передать компоновщику флаг /DELAYLOAD foo.dll;
  2. в самом начале main (), вручную вызвать auto handle = LoadLibraryA("foo.dll") ипроверьте, что дескриптор не равен NULL;
  3. , если он не равен NULL, продолжайте работать;
  4. в конце main (), вызовите FreeLibrary (handle)?

Мне интересно, что-нибудь сломается из-за смешивания отложенной загрузки и ручного вызова LoadLibraryA (). Кроме того, если бы кто-то мог предложить более простой или более правильный способ сделать то, что я хочу, я был бы признателен за это.

1 Ответ

1 голос
/ 12 октября 2019

Если вы собираетесь это сделать, вы должны вызвать FreeLibrary() сразу же после вашего «тестового» вызова на LoadLibrary() - но, безусловно, прежде чем вызвать автоматическую загрузку, вызвав одну из ее подпрограмм! (Это, конечно, при условии, что вызов был успешным!) Таким образом, должно не быть проблемой с конфликтами загрузки. (Вы также можете выполнить дополнительные тесты, такие как проверка наличия всех необходимых подпрограмм, с вызовами GetProcAddress().

После того, как вы убедились, что DLL есть (и, очевидно, загружаемая), вы бызатем продолжите выполнение - DLL будет загружена «автоматически», когда ваш исполняемый файл сначала вызовет одну из своих экспортируемых функций.

Если у вас уже есть DLL, загруженная (вручную), она попытается загрузить себя дважды втот же процесс (я думаю). В какой-то момент это наверняка вызовет проблемы.

PS: Это хороший способ сделать чек, ИМХО !! Пожалуйста, дайте нам знать, как это происходит.

РЕДАКТИРОВАТЬ: После (несколько обширного) обсуждения в комментариях, теперь мне ясно, что нет необходимости звонить FreeLibrary() - либо когда я предложил, либо, действительно, в концепрограмма (так или иначе она будет выгружена). Но это все же хорошее решение!

...