2016-02-15 2 views
0

Это очень простой, фундаментальный вопрос от новичка C++, так что, пожалуйста, голый со мной.Как использовать dll

Я недавно очень смутился в попытке использовать gdi +, так как файлы sdk содержат только три файла, один из которых является DLL-файлом. Я предположил, что мне нужно загрузить dll, и так как меня никогда не учили или не подвергали таким вещам, то, разумеется, я был сбит с толку. (теперь кажется, что установка также поместила файлы gdi + sdk в папку, в которой VS ищет стандартные файлы (вещи, которые включены через <>), и все еще оставляет меня неясным относительно того, что там делает dll.)

Я исследовал и получил объяснение, которое показало следующее:

Файл .dll - это файл, код которого загружается в память при его выполнении, экономя время, ссылаясь на память через указатели, а не копируя код как стандартная загрузка lib. Это также позволяет универсальность для изменения dll без изменения исполняемого файла.

Чтобы использовать его, вы должны использовать loadlibrary, а затем getpr ocaddress, чтобы получить указатель (или что-то, неясно мне) до конкретных элементов, таких как класс или функция, в dll.

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

Из того, что я могу сказать, это предположение неверно, и я хотел бы, чтобы кто-то знал внутри и из этой библиотеки .lib и .dll, чтобы объяснить это, если они захотят.

Пожалуйста, помните, что мое текущее понимание цели dll или lib заключается в повторном использовании кода. Создайте файл с помощью классов и методов, а затем просто импортируйте его для его использования. В этом смысле я очень неопытен в библиотеках.

ответ

2

. DLL и .lib - это, как вы сказали, варианты повторного использования кода. Файл .dll называется динамической библиотекой, поскольку библиотека загружается во время выполнения, а .lib - это статическая библиотека, загружаемая и помещенная в вашу программу во время компиляции. Я знаю три варианта использовать эти библиотеки:

  • Вы используете .dll непосредственно, что означает, используя LoadLibrary() для загрузки .dll в память, а затем использовать GetProcAdress, чтобы получить указатель на функцию (в основном адрес памяти в переменной, но вы можете использовать ее как функцию). Проблема здесь: вам нужно знать искаженные имена функций (mangled = compiler генерирует уникальные имена для перегрузок функций и т. Д.), И вам нужно знать аргументы функции и возвращаемые значения.
  • Вы используете статическую библиотеку (.lib). Это означает, что вы включаете заголовочный файл библиотеки в свой проект, который сообщает вашему компилятору имена функций (без изменения), их параметры и возвращаемые значения, так же, как вы делали бы это с функциями, определенными в разных файлах .cpp. Но тогда код библиотеки копируется в вашу программу, что увеличивает ее размер, и если библиотека обновляется, вам необходимо перекомпилировать свою программу.
  • Некоторые SDK включают в себя предварительно созданные (или легко построенные) файлы статической библиотеки (.lib), которые на самом деле содержат только код заглушки, который затем загружает .dll, содержащий фактический код в начале вашей программы. Это даст вам лучшее из обеих возможностей, так как вам вообще не нужно возиться с указателями имен/указателями функций, при этом загружая библиотеку во время выполнения. Это также означает, что вам нужно перекомпилировать вашу программу только после изменения API (= заголовка) вашей библиотеки.
  • Шаги, связанные с первым примером в этом списке, могут обрабатываться операционной системой хоста: если ваш компилятор является умным, он может определять, какие внешние функции вы вызываете, и объявлять их в «Таблице импорта» непосредственно в вашем выпуске запускаемый файл. Когда ОС загружает вашу программу, она может связывать таблицу импорта для вас - это замедляет время загрузки программы (потенциально теряя время, если определенные функции никогда не вызывают), или заставляя программу не загружаться, если файл зависимостей не найден на жестком диске (тогда как если вы используете LoadLibrary, вы можете изящно потерпеть неудачу), но это значительно снижает нагрузку программиста.
  • Существует также COM (или CORBA), который можно рассматривать как расширение 1-го примера в этом списке; COM позволяет показывать и экспортировать целые объекты вместо бесплатных функций. Это мощный подход, который позволяет использовать такие вещи, как повторно используемые пользовательские интерфейсные виджеты и код доступа к базе данных. Недостатком является то, что DLL компонентов контейнера компонентов должен соответствовать определенному двоичному интерфейсу приложений и требует много работы с ногами и других файлов, таких как IDL (Interface Definition Language).
    • Сторонние заметки: время выполнения, такое как Java и CLR, обеспечивает COM-подобный способ для компонентов объявлять классы и компоненты, которые они содержат, и разрешать другим программам ссылаться и использовать эти объекты во время выполнения без какой-либо привязки времени компиляции. Microsoft Windows 8.0 (и более поздние) обобщают этот подход на более исполняемые двоичные типы, используя «Windows Runtime», где простой файл метаданных (.winmd) по существу служит своего рода «экспортным списком». Его можно считать своего рода «COM на стероидах» или «COM для 21-го века», если вы чувствуете скупость.
+0

Я считаю, что GDI +, в примере OP, использует третий вариант. – Dai

+0

Возможно, вы захотите осветить некоторые другие параметры, например, когда ОС выполняет привязку к рабочему времени, не требуя «LoadLibrary' /' GetProcAddress', используя таблицу импорта PE, а также COM (или CORBA), которая использует четко определенные ABI для повторного использования объектов на уровне компонентов. – Dai

+0

Надеюсь, что для всех, кто пытается использовать библиотеку. Первый вариант - беспорядок, которого вы обычно не хотите, и второй вариант, как сказано в названии, статичный. Поскольку я не использовал другие варианты, кроме трех выше, я не могу сказать о них, поэтому не стесняйтесь добавлять свой собственный ответ, Дай. Ждем больше об этом. – Anedar

0

Чтобы использовать DLL, вам:

  1. #include заголовочный файл при компиляции.
  2. включает файл .lib («implib») в процессе ссылки, так что компоновщик знает, что символы приходят во время выполнения из DLL.
  3. Расположите файл DLL, который будет присутствовать в каталоге, включенном в переменную среды PATH.

Обратите внимание, что в некоторых версиях Windows этот процесс осложняется соображениями SxS, и вам понадобится манифест. Вы можете посмотреть SxS и связанные с этим проблемы для себя.

Смежные вопросы