Как использовать сторонний DLL-файл в Visual Studio C ++?

Я понимаю, что мне нужно использовать LoadLibrary (). Но какие еще шаги я должен предпринять, чтобы использовать сторонний DLL-файл?

Я просто прыгнул в C ++, и это единственная часть, которую я не получаю (как программист Java). Я просто изучаю, как я могу использовать Qt- библиотеку и tesseract-ocr, но процесс не имеет для меня никакого смысла и настолько затруднен для Google.

Как сообщить компилятору о функциях, которые я использую? Должен ли быть файл include от стороннего поставщика?

Как все говорят, LoadLibrary – это трудный способ сделать это, и вряд ли когда-либо понадобится.

DLL должна была иметь файл .lib для связывания и один или несколько файлов заголовков в #include в ваши источники. Файлы заголовков будут определять classы и прототипы функций, которые вы можете использовать в DLL. Это вам понадобится, даже если вы используете LoadLibrary.

Для связи с библиотекой вам может потребоваться добавить файл .lib в конфигурацию проекта в разделе «Linker / Input / Additional Dependencies».

Чтобы включить сторонние библиотеки DLL в проект VS 2008 C ++, я сделал следующее (вы должны перевести на 2010, 2012 и т. Д.) …

Я поместил файлы заголовков в свое решение с другими моими файлами заголовков, внес изменения в свой код, чтобы вызвать функции DLL (иначе зачем мы все это делаем?). : ^) Затем я сменил сборку, чтобы связать код LIB с моим EXE, скопировать библиотеки DLL на место и очистить их, когда я сделал «чистый», – я объясняю эти изменения ниже.

Предположим, у вас есть 2 сторонних DLL, A.DLL и B.DLL, и у вас есть файл LIB-заглушки для каждого (A.LIB и B.LIB) и файлы заголовков (AH и BH).

  • Создайте каталог «lib» в каталоге решений, например, с помощью проводника Windows.
  • Скопируйте ваши сторонние файлы .LIB и .DLL в этот каталог

(Вам нужно будет сделать следующий набор изменений один раз для каждой целевой цели сборки, которую вы используете (Debug, Release).)

  1. Сделайте EXE зависимым от файлов LIB

    • Перейдите в Configuration Properties -> Linker -> Input -> Additional Dependencies и перечислите файлы .LIB по одному за раз, разделенные пробелами : A.LIB B.LIB
    • Перейдите в «Свойства конфигурации» -> «Общие» -> «Дополнительные каталоги библиотек» и добавьте каталог «lib» в любой, который у вас там есть. Записи разделяются точкой с запятой . Например, если у вас уже есть $(SolutionDir)fodder , вы меняете его на $(SolutionDir)fodder;$(SolutionDir)lib чтобы добавить «lib».
  2. Заставить библиотеки DLL для копирования в выходной каталог

    • Перейдите в Свойства конфигурации -> События сборки -> Событие после сборки
    • В командной строке введите следующие значения (для значений переключателей см. «XCOPY /?» В окне DOS):

    XCOPY "$(SolutionDir)"\lib\*.DLL "$(TargetDir)" /D /K /Y

    • Вы можете поместить что-то вроде этого для Описание:

    Copy DLLs to Target Directory

    • Исключено из сборки должно быть No . Нажмите « OK .
  3. Скажите VS, чтобы очистить библиотеки DLL, когда он очищает выходную папку:

    • Перейдите в «Свойства конфигурации» -> «Общие» -> «Расширения для удаления по очистке» и нажмите «…»; добавьте *.dll в конец списка и нажмите « OK .

Это два способа использования DLL-файла в Windows:

  1. Существует заглушка (.lib) с соответствующими файлами заголовков. Когда вы связываете свой исполняемый файл с lib-файлом, он автоматически загружает DLL-файл при запуске программы.

  2. Загрузка DLL вручную. Обычно это то, что вы хотите сделать, если разрабатываете систему плагинов, где есть много DLL-файлов, реализующих общий интерфейс. Ознакомьтесь с документацией для LoadLibrary и GetProcAddress для получения дополнительной информации об этом.

Для Qt я подозреваю, что есть заголовки и статическая библиотека, которые вы можете включить и связать в своем проекте.

Чтобы использовать Qt с динамической qtmaind.lib , вы должны указать файлы lib (обычно qtmaind.lib , QtCored4.lib и QtGuid4.lib для QtGuid4.lib «Отладка») в
Properties » Linker » Input » Additional Dependencies .

Вы также должны указать путь, в котором находятся библиотеки , а именно:
Properties » Linker » General » Additional Library Directories .

И вам нужно, чтобы соответствующие .dll файлы были доступны во время выполнения, либо сохраняя их в той же папке, что и ваш .exe либо в папке, которая находится на вашем пути .

Вам нужно всего лишь использовать LoadLibrary, если вы хотите опоздать на связывание и разрешать импортированные функции во время выполнения. Самый простой способ использовать стороннюю DLL – связать с .lib.


В ответ на ваше изменение:

Да, сторонний API должен состоять из dll и / или lib, которые содержат файлы реализации и заголовка, объявляющие требуемые типы. Вам нужно знать определения типов в зависимости от того, какой метод вы используете: для LoadLibrary вам нужно будет определить указатели на функции, чтобы вы могли просто написать собственный заголовочный файл. В принципе, вам нужно всего лишь использовать LoadLibrary, если вам нужна поздняя привязка. Одной из веских причин для этого было бы, если вы не уверены, что DLL будет доступна на целевом ПК.

Если вы согласны с тем, что сможете использовать его, то сторонняя библиотека должна иметь * .lib-файл, а также файл * .dll. Вам просто нужно добавить * .lib в список входных файлов в параметрах «Linker» вашего проекта.

Этот * .lib-файл не обязательно является «статической» библиотекой (содержащей код): вместо этого * .lib может быть просто файлом, который связывает ваш исполняемый файл с DLL.

  • Как определить процесс создания / завершения процесса win32 в c ++
  • Создание прозрачного windows в C ++ Win32
  • Как я рекурсивно создаю папку в Win32?
  • WIN32_Processor :: Is ProcessorId Unique для всех компьютеров
  • Как настроить системное меню формы Windows?
  • Как хранить и извлекать учетные данные из диспетчера учетных данных Windows Vault?
  • Возможно ли программно добавить папки на панель быстрого доступа Windows 10 в окне проводника?
  • Рабочий пример CreateJobObject / SetInformationJobObject pinvoke в .net?
  • Чтение из текстового поля в другом приложении
  • Глобальный Ключ для клавиатуры от службы Windows
  • Как сделать окно WPF подвижным, перетащив расширенный оконный кадр?
  • Interesting Posts

    Почему Windows всегда использует столько виртуальной памяти, сколько установлена ​​RAM?

    Что находится в LibreOffice Вычислить эквивалент Excel «Специальная вставка»> «Значение»?

    Использование R для загрузки ZIP-файла, извлечения и импорта данных

    Как запустить активность только один раз, когда приложение открывается в первый раз?

    Как использовать Single TextWatcher для нескольких EditTexts?

    Преобразование магнитного поля X, Y, Z значений из устройства в глобальную систему отсчета

    Разница между `set`,` setq` и `setf` в Common Lisp?

    Как получить имя файла из полного пути с помощью PHP?

    getOutputStream () уже вызван для этого ответа

    Установка Windows из раздела

    Что (на самом деле) происходит, когда вызывается функция с предупреждением «control достигает конца не-void функции»?

    Windows 10: панель мониторинга первичного монитора не скрывается

    Как вывести свойство isBrotherOf между двумя людьми

    node.js есть ли подходящий способ parsingа JSON с большими числами? (long, bigint, int64)

    Я не могу пинговать мой маршрутизатор с внешнего

    Давайте будем гением компьютера.