Daniro_San
@Daniro_San
Программист

Есть ли простой способ подключить динамическую библиотеку ( .dll) в проект?

Нашел немало способов, но все они основаны на использовании WinApi, с объявлениями прототипов каждой функции.
Есть ли хоть один сравнительно простой способ подключить .dll без лишних заморочек и пользоваться ею?
Можно привести пример кода для .h файла?
  • Вопрос задан
  • 465 просмотров
Решения вопроса 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
От прототипов никуда не денешься. Другое дело, что прототипы функций с++ можно сгенерировать из самой dll, поскольку экспортированные имена содержат всю необходимую для этого информацию.
Ответ написан
Nipheris
@Nipheris Куратор тега C++
Что-то тут вам насоветовали в комментах....

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

Если статически - то ничего сложного нет, создайте в студии проект DLL или сами прочитайте про макросы для импорта/экспорта - они нужны, чтобы с ОДНИМ И ТЕМ ЖЕ хедером и компилить DLL, и пользоваться ей. По сути вам нужны эти макросы (которые студия сделает за вас, если создадите проект по шаблону), и вам нужно проставить их на каждом классе или свободной функции, которые нужно экспортировать. Все. Теперь вы можете и саму DLL скомпилить с этим заголовочным файлом, и подключить его в другой проект, который должен использовать DLL.

Если динамически - тогда без описания прототипов действительно не обойтись. И генерация из DLL тоже не особо поможет вам, т.к. информация о классах действительно потеряется.

Запомните - роль метаданных для компилятора C++ играют именно заголовочные файлы. В отличие и java и прочих дотнетов, где информация о том, что "внутри" поставляется вместе с кодом в том же самом контейнере (в пакете в джаве и в сборке в дотнете), скомпилированные нативные модули вроде EXE, ELF, DLL, LIB, SO и прочих не имеют стандартизированных способ хранить информацию о классах. Они просто не на том уровне работают - они больше для операционной системы или линковщика, чем для компилятора. А классы - это фишка конкретного языка, в Си например нет классов по определению. Соответственно, низкоуровневые вещи вроде DLL не должны заботиться о такой вещи, как классы C++. Поэтому практически с любой библиотекой на C++, даже если она компилится в LIB или DLL, поставляется хедер-файл. Возможно, вы еще не сталкивались с Boost - в нем многие классы вообще не могут быть скомпилированы заранее, т.к. являются шаблонными, и поэтому они поставляются прямо в виде заголовочных файлов. Такие библиотеки, в которых все или часть сущностей не подлежат предварительной компиляции, а поставляются в виде исходного кода файлов для последующего инклуда, называются header-only. Это вам для общего развития.

Так что и в случае динамического подключения, все не так сложно - вам точно так же нужно иметь заголовочный файл с прототипами, а также с парными им типами указатель-на-функцию. Этот хедер также можно будет использовать как в самой DLL, так и при ее загрузке через LoadLibrary и получении функций через GetProcAddress (вы же это имели в виду в вопросе?). Но еще раз отмечу - это "сложный" способ, который требуется только если вы заранее НЕ ЗНАЕТЕ, что хотите загрузить - это используется как правило для реализации плагинов.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы