Неявное и явное связывание с DLL - PullRequest
7 голосов
/ 25 января 2011

Когда нужно явно или неявно ссылаться на DLL и каковы общие практики или подводные камни?

Ответы [ 3 ]

8 голосов
/ 25 января 2011

Редко явно связать DLL. В основном потому, что это больно и подвержено ошибкам. Вам нужно написать объявление указателя функции для экспортируемой функции и получить правильный код LoadLibrary + GetProcAddress + FreeLibrary. Вы сделаете это только в том случае, если вам нужна зависимость времени исполнения от DLL подключаемого модуля или вы хотите выбирать из набора DLL на основе конфигурации. Или для работы с версиями, функция API, которая доступна только в более поздних версиях Windows, например. Явные ссылки по умолчанию для библиотек COM и .NET DLL.

Дополнительная справочная информация в этой статье библиотеки MSDN .

5 голосов
/ 25 января 2011

Я согласен с другими, кто уже ответил вам (Ганс Пассант и шош). Я хочу добавить только две вещи:

1) Один из распространенных сценариев, когда вам нужно использовать LoadLibrary и GetProcAddress, заключается в следующем: вы хотите использовать какой-то новый API, существующий только в новых версиях Windows, но этот API не критичен для вашего приложения. Таким образом, вы проверяете LoadLibrary и GetProcAddress, существует ли нужная вам функция, и используете ее в этом случае. То, что делает ваша программа, если функции не существуют, зависит от вашей реализации.

2) Есть один важный вариант, который вы не включили в свой вопрос: отложенная загрузка DLL . В этом случае операционная система загрузит DLL при вызове одной из своих функций, а не при запуске приложения. Это позволяет использовать библиотеки импорта (.lib файлы) в некоторых сценариях, в которых явное связывание должно использоваться с первого взгляда. Кроме того, это улучшает время запуска приложений и широко используется самой Windows. Так что путь тоже рекомендуется.

4 голосов
/ 25 января 2011

Я предполагаю, что вы ссылаетесь на соединение с использованием .lib против загрузки DLL динамически с использованием LoadLibrary().

Загрузка DLL статически путем ссылки на ее .lib обычно безопаснее. Этап связывания проверяет, что все точки входа существуют во время компиляции, и нет никаких шансов, что вы загрузите DLL, которая не имеет ожидаемой функции. Также легче не использовать GetProcAddress().

Так что, как правило, динамическую загрузку следует использовать только тогда, когда это абсолютно необходимо.

...