Форум программистов, компьютерный форум CyberForum.ru

dllimport - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.71
noname_club
 Аватар для noname_club
100 / 88 / 9
Регистрация: 01.05.2013
Сообщений: 563
27.10.2013, 14:21     dllimport #1
хотелось бы уточнить кое-какую информацию относительно использования 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, который при создании будет динамически линковать/импортировать функции, и будет исполнять роль вместо заголовка для нее.

Но это както немного странно выглядит
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2013, 14:21     dllimport
Посмотрите здесь:

Visual C++ dllimport
DllImport gdi32 C#
DllImport (Из С++ в С#) C#
C# не видит DllImport
C# DllImport
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
27.10.2013, 14:27     dllimport #2
Если я не ошибаюсь, то можно создать библиотеку импорта из DLL. Копай в сторону "create dll import library"
noname_club
 Аватар для noname_club
100 / 88 / 9
Регистрация: 01.05.2013
Сообщений: 563
27.10.2013, 14:33  [ТС]     dllimport #3
создать библиотеку импорта
правильно я понимаю, .lib файлы это не что иное как библиотека импорта
то есть в ней прописаны адреса функций для компилятора?
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
27.10.2013, 14:35     dllimport #4
Цитата Сообщение от noname_club Посмотреть сообщение
правильно я понимаю, .lib файлы это не что иное как библиотека импорта
то есть в ней прописаны адреса функций для компилятора?
Это может быть как библиотека импорта, так и просто статическая библиотека, не привязанная к DLL.
Но из DLL нельзя сделать статическую библиотеку, только библиотеку импорта.
noname_club
 Аватар для noname_club
100 / 88 / 9
Регистрация: 01.05.2013
Сообщений: 563
27.10.2013, 14:52  [ТС]     dllimport #5
я тут полазил по интернету, и нашел вот это:
http://www.coderetard.com/2009/01/21...visual-studio/

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

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

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

// ---

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

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

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

Естессно, динамическая линковка может быть выполнена и по требованию самостоятельно: LoadLibrary() + GetProcAddress() руками и поехали.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2013, 15:13     dllimport
Еще ссылки по теме:

DllImport из Delphi C#
C++ Ошибка error C2491: SetSiteInterface: определение dllimport функция не разрешено
Создание и использование dll- Для чего dllimport? C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,057
27.10.2013, 15:13     dllimport #7
Цитата Сообщение от noname_club Посмотреть сообщение
Осталось выяснить разницу между статической линковкой через .lib и динамической через GetProcAddress
ты немножко путаешь
статическая линковка и динамическая
это все в твоем примере под номером 1
давая определенные команды линкеру ты получишь или статическую или динамическую линковку

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

а то что ты называешь динамической линковкой
это явная загрузка DLL или по другому Динамическая загрузка и выгрузка DLL
разница в том что библиотека будет проецироваться в адресное пространство только тогда когда она нужна( LoadLibrary )
посмотри вот эту статейку
http://www.codenet.ru/progr/visualc/Using-DLL.php
Yandex
Объявления
27.10.2013, 15:13     dllimport
Ответ Создать тему
Опции темы

Текущее время: 10:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru