Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/32: Рейтинг темы: голосов - 32, средняя оценка - 4.84
 Аватар для noname_club
112 / 103 / 12
Регистрация: 01.05.2013
Сообщений: 603

dllimport

27.10.2013, 14:21. Показов 6528. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
хотелось бы уточнить кое-какую информацию относительно использования dll в с++

вики учебник предлагает 2 варианта импорта dll функций

1) с использованием .lib .obj и прочих "файлов"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
 /*
  * Указываем, что тело функции находится в другом файле.
  * Не забыть про объектный модуль DLL при линковке!
  */
 extern "C" __declspec(dllimport)double AddNumbers(double a, double b);
 
 /* Используем функцию как обычно */
 int main(int argc, char **argv)
 {
     double result = AddNumbers(1, 2);
     printf("The result was: %f\n", result);
     return 0;
 }
естественно только при наличии .lib .obj данный код будет работать

2) динамическая линковка
данный метод не требует ничего кроме самой dll
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <windows.h>
 #include <stdio.h>
 
 /*
  * Тип используемой функции
  * (комбинация типов параметры и возвращаемого значения)
  */
 typedef double (*importFunction)(double, double);
 
 int main(int argc, char **argv)
 {
     importFunction addNumbers;
     double result;
 
     /* Загружаем DLL в память */
     HINSTANCE hinstLib = LoadLibrary("Example.dll");
     if (hinstLib == NULL) {
         printf("ERROR: unable to load DLL\n");
         return 1;
     }
 
     /* Получаем указатель на функцию */
     addNumbers = (importFunction)GetProcAddress(hinstLib, "AddNumbers");
     if (addNumbers == NULL) {
         printf("ERROR: unable to find DLL function\n");
         return 1;
     }
 
     /* Вызываем функцию через указатель */
     result = addNumbers(1, 2);
 
     /*
      * Выгружаем DLL (в принципе, это будет сделано
      * автоматически при выходе из программы)
      */
     FreeLibrary(hinstLib);
 
     /* Отображаем результат */
     printf("The result was: %f\n", result);
 
     return 0;
 }

и получается что имея на руках одну лишь DLL, будет работать только 2 способ с динамической линковкой

неужели нет других вариантов подключения DLL если отсуствуют .lib .obj файлы?

Добавлено через 3 минуты
разумеется я допускаю написание класса для dll, который при создании будет динамически линковать/импортировать функции, и будет исполнять роль вместо заголовка для нее.

Но это както немного странно выглядит
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.10.2013, 14:21
Ответы с готовыми решениями:

Создание и использование dll- Для чего dllimport?
Всем доброго времени суток Вот пытаюсь разобраться в создании и использовании dll. По данной теме у меня возникли два вопроса. 1....

Синтаксическая ошибка при создании библиотеки: __declspec(dllimport)
Итак, братья-кролики , создаю я дллку с таким вот кодом , а мне ошибочку все время не понятную выбивает. Подсобите с решением. #ifndef...

Ошибка error C2491: SetSiteInterface: определение dllimport функция не разрешено
Добрый вечер. Помогите пожалуйста. Plugin компилируется и работает под х32 Пытаюсь скомпилировать под х64 выдает ошибку error...

6
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
27.10.2013, 14:27
Если я не ошибаюсь, то можно создать библиотеку импорта из DLL. Копай в сторону "create dll import library"
0
 Аватар для noname_club
112 / 103 / 12
Регистрация: 01.05.2013
Сообщений: 603
27.10.2013, 14:33  [ТС]
создать библиотеку импорта
правильно я понимаю, .lib файлы это не что иное как библиотека импорта
то есть в ней прописаны адреса функций для компилятора?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
27.10.2013, 14:35
Цитата Сообщение от noname_club Посмотреть сообщение
правильно я понимаю, .lib файлы это не что иное как библиотека импорта
то есть в ней прописаны адреса функций для компилятора?
Это может быть как библиотека импорта, так и просто статическая библиотека, не привязанная к DLL.
Но из DLL нельзя сделать статическую библиотеку, только библиотеку импорта.
0
 Аватар для noname_club
112 / 103 / 12
Регистрация: 01.05.2013
Сообщений: 603
27.10.2013, 14:52  [ТС]
я тут полазил по интернету, и нашел вот это:
http://www.coderetard.com/2009... al-studio/

предлагается использовать visual studio как инструмент для компиляции lib файла

способ безусловно хороший, для линковки "неизвестных" библиотек

в моем случае все функции библиотеки и типы их аргументов известны.

// ---

Осталось выяснить разницу между статической линковкой через .lib и динамической через GetProcAddress

если нет разницы пойду писать класс автолинковки сабжа через GetProcAddress ибо больше ничего не остается
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
27.10.2013, 15:05
Цитата Сообщение от noname_club Посмотреть сообщение
Осталось выяснить разницу между статической линковкой через .lib и динамической через GetProcAddress
Я побуду немного капитаном. Статическая линковка — это когда линкер на этапе сборки бинарника берёт код из статической библиотеки (*.lib) и копипастит его в собираемый бинарник. Подменить слинкованную таким образом функцию, естессно, можно только изменив код самого бинарника.

Динамическая линковка — это когда линкер знает, в какой динамической библиотеке находится нужная функция, и вставляет в программу соответствующие директивы. При загрузке программы загрузчик сам подтянет нужную динамическую библиотеку, вытащит из неё с помощью GetProcAddress() / dlsym() / whatever адрес функции и запишет его в специальную табличку, через которую программа обращается к функциям из динамических библиотек.

Естессно, динамическая линковка может быть выполнена и по требованию самостоятельно: LoadLibrary() + GetProcAddress() руками и поехали.
2
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
27.10.2013, 15:13
Цитата Сообщение от noname_club Посмотреть сообщение
Осталось выяснить разницу между статической линковкой через .lib и динамической через GetProcAddress
ты немножко путаешь
статическая линковка и динамическая
это все в твоем примере под номером 1
давая определенные команды линкеру ты получишь или статическую или динамическую линковку

разница в том что при статической все функции сторонней библиотеки войдут в твой исполняемый файл, нужно будет таскать один екзешник
а при динамической функции будут лежать в библиотеке, нужно таскать с собой и екзешник и Дллку
в любом случае эти функции будут проецироваться в адресное пространство потока при запуске файла

а то что ты называешь динамической линковкой
это явная загрузка DLL или по другому Динамическая загрузка и выгрузка DLL
разница в том что библиотека будет проецироваться в адресное пространство только тогда когда она нужна( LoadLibrary )
посмотри вот эту статейку
http://www.codenet.ru/progr/visualc/Using-DLL.php
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.10.2013, 15:13
Помогаю со студенческими работами здесь

Подключение динамической библиотеки (DLL), MSVC __declspec dllimport dllexport
Для экспортирования методов из DLL в заголовочном файле используется конструкция __declspec(dllimport) или __declspec(dllexport) ...

dllimport
Здравствуйте, подскажите в каких случаях используется dllimport? Я почитал статьи, но толкового ответа не нашел. Вот к примеру не...

DllImport
Я создал проект и в нем использую библиотеку directX.AudioVideoPlayback. Как мне в коде это указать?

DllImport (Из С++ в С#)
Добрый день, уважаемые господа! Есть такая проблема импорта dll написанной на С++ в C#. Перерыл кучу форумов, но так ничего и не понял... ...

DllImport из Delphi
Доброго времени суток, уважаемые форумчане, имеется библиотека, написанная на Delphi, а в ней нужная функция. Сама бибилотека тут...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru