В мире Windows существует (как минимум) 4 способа использования DLL:
- Динамическое связывание во время выполнения (Что вы делаете сейчас)
- Динамическое связывание во время загрузки («типичный» способ использования DLL)
- Динамическое связывание с задержкой нагрузки
- Пересылка DLL
Мне не нужно объяснять Динамическое связывание во время выполнения , поскольку вы уже это делаете.Я предпочитаю не объяснять Delay-Load Dynamic Linking теперь за пределами простого описания того, что это в общих чертах.Задержка загрузки, по сути, такая же, как динамическое связывание во время загрузки, за исключением того, что она выполняется точно в срок, а не при загрузке приложения.Это не так полезно и не так выгодно, как вы можете подумать, с ним трудно работать и сложно его кодировать.Так что давайте не будем идти туда, по крайней мере сейчас. Пересылка DLL даже более экзотична, чем Delay-Loading - настолько экзотична, что я даже не слышал об этом, пока @mox не упомянул об этом в комментариях.Я позволю вам прочесть ссылку выше, чтобы узнать об этом, но достаточно сказать, что перенаправление DLL - это когда вы вызываете экспортированную функцию в одной DLL, но этот запрос на самом деле перенаправляет в другую функцию в другойDLL.
Динамическое связывание во время загрузки
Это то, что я бы назвал Связывание с Vanilla DLL .
Это то, что большинство людей имеют в видуони ссылаются на использование DLL в своих приложениях.Вы просто #include
заголовочный файл DLL и ссылку на файл LIB.Нет необходимости GetProcAddress()
или создавать указатель функции typedefs.Вот как это работает в двух словах:
1) Обычно вы получаете 3 файла: DLL с кодом времени выполнения, файл LIB и файл заголовка.Заголовочный файл - это просто заголовочный файл - он описывает все возможности DLL, которые вы можете использовать.
2) Вы пишете свое приложение, #include
извлекаете заголовочный файл из DLL и делаете вызовыэти функции, как если бы вы использовали любую функцию в любом заголовочном файле.Компилятор знает имена функций и объектов, которые вы используете, потому что они находятся в заголовочном файле DLL.Но он еще не знает, где они находятся в памяти.Вот где появляется LIB-файл ...
3) Перейдите в настройки компоновщика для своего проекта и добавьте «дополнительную библиотечную зависимость», указав файл LIB.Файл LIB сообщает компоновщику, где функции и объекты, которые вы используете из файла H, находятся в памяти (в относительных, а не абсолютных терминах, очевидно).
4) Скомпилируйте ваше приложение.Если вы все настроили правильно, он должен скомпилировать, связать и запустить.Когда вы получаете «неразрешенную внешнюю ссылку» ошибки компоновщика обычно это происходит из-за неправильной настройки.Возможно, вы либо не указали правильный путь к файлу LIB, либо вам нужно добавить больше файлов LIB.