Задать вопрос
Ternick
@Ternick

Что лучше использовать #include или LoadLibrary?

Доброго времени суток :)
Искал в интернете, ничего особо понятного не написано.

Много вопросов

1) Откуда берёт библиотеки LoadLibrary ?
2) Проверяет ли LoadLibrary подпись библиотеки, если берёт её из системных путей ?
3) Уменьшится ли размер исполняемого файла если использовать только LoadLibrary, без #include ? {Один не в счёт, надо же как-то брать HMODULE, WINAPI и прочие штуки ...}
4) Что лучше использовать #include или LoadLibrary ?
5) Если библиотека существует и существует метод к которому я хочу обратится, может ли появиться ошибка ?
  • Вопрос задан
  • 455 просмотров
Подписаться 1 Средний 8 комментариев
Решения вопроса 2
@MarkusD Куратор тега C++
все время мелю чепуху :)
Вопрос, на самом деле, заключается не в выборе межу LoadLibrary и #include, а в выборе между явным и неявным связыванием.

При неявном связывании компоновщик добавляет в PE-секцию импорта дополнительный блок импорта конкретно указанной библиотеки. Этот блок обрабатывается загрузчиком PE в момент подготовки к запуску процесса. Эта информация тебе уже должна быть знакома. К моменту передачи управления в точку входа процесса все неявно связанные библиотеки уже загружены и готовы к работе. Код процесса не нуждается в явном управлении загрузкой таких библиотек.

Явное связывание выполняется полностью кодом процесса, для чего и применяется набор функций для работы с библиотеками. Явное связывание - это большая рутина. Но иногда без этой рутины никак.
Поиск динамических библиотек при работе LoadLibrary[?] осуществляется в соответствии с определенным порядком. При этом, путями для поиска динамических библиотек можно управлять в ручном режиме, добавляя новые или замещая имеющиеся пути поиска.

Директива препроцессора #include[?] лишь косвенно относится к вопросу. На самом деле к вопросу относится директива #pragma comment( lib )[?].
Прагма работает только для cl - компилятора от Microsoft. Подключаемая таким образом статическая библиотека должна находиться в перечисленных Library Path, в настройках сборки проекта. Эта прагма является альтернативой прямого указания статической библиотеки в настройках сборки проекта.
Эту директиву любят использовать в сторонних заголовках, код для которых поставляется только в бинарном виде, в статических или динамических библиотеках. Вместе с динамической библиотекой такого решения поставляется и библиотека статическая, в которой находятся инструкции для неявного связывания с динамической библиотекой. Результатом работы #pragma comment( lib ) с такой статической библиотекой будет неявное связывание твоего кода с указанной динамической библиотекой.

Размер PE ощутимо растет при компоновке из статических библиотек.
Явное и неявное связывание слабо влияют на размер PE, но явное связывание усложняет жизнь разработчика, т.к. поддерживать загрузку интерфейса библиотеки разработчику придется самому.
Ответ написан
Комментировать
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Насколько я понимаю.
В include описывается библиотека, она может быть статической линковки, так и динамической.
В случае динамической линковки компилятор берет на себя все ваши вызовы loadLibrary, getProcAddress и прочее.

1) Откуда берёт библиотеки LoadLibrary ?

Папка приложения, Системные пути (PATH), knowdlls, полный путь до библиотеки

2) Проверяет ли LoadLibrary подпись библиотеки, если берёт её из системных путей ?
да,
https://msrc-blog.microsoft.com/2014/05/13/load-li...

3) Уменьшится ли размер исполняемого файла если использовать только LoadLibrary, без #include ? {Один не в счёт, надо же как-то брать HMODULE, WINAPI и прочие штуки ...}
Линкуйте библиотеки динамически, размер уменьшится, LoadLibrary ни как не влияет.

4) Что лучше использовать #include или LoadLibrary ?
5) Если библиотека существует и существует метод к которому я хочу обратится, может ли появиться ошибка ?

Понимание что они такие жирные
https://rsdn.org/article/cpp/crt.xml
Как загружается PE файл
https://rsdn.org/article/baseserv/peloader.xml
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@anikavoi
#include - директива предпроцессора компилятора, она "срабатывает" когда вы компилируете свой исходный код.
LoadLibrary - это функция api windows, которая подгружает DLL. Соответственно "срабатывает" когда уже откомпилированный экзешник запущен. DLL - это уже откомпилированная библиотека - она должна лежать где-то по PATH.
2) Насколько я знаю - нет (что там в 8,10,2016 - хз, я уже давно на линуксе)
3) вообще не понял, извините
4) Еще раз - #include - это не "библиотека", хотя конечно в нее можно запузырить весь код, но imho лучше так не делать. В инклюдах должны жить ОБЪЯВЛЕНИЯ, а сам код в .cpp
5) опять не понял.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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