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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
h3mbr0
233 / 76 / 18
Регистрация: 12.03.2012
Сообщений: 327
#1

Написание и использование DLL - C++

28.07.2013, 21:08. Просмотров 671. Ответов 5
Метки нет (Все метки)

Доброго времени суток!

При попытке написать элементарную DLL возникло несколько вопросов:
1) Почему без указания экспорта в DEF-файле, функцию нельзя "подцепить" с помощью GetProcAddress, при том, что она есть в таблице экспорта?

2) Почему многие используют EXTERN_C(extern "C") перед описанием экспортируемой функцией?

3) Какие функции экспортируются при экспорте всего класса? (У меня экспортируется только одна, что она делает и почему не экспортируются остальные? Если добавить в класс string, в экспорт попадет еще несколько непонятных функций, почему?)

4) Как расшифровывается название функции "??4CFoo@@QAEAAV0@ABV0@@Z"(та самая, единственная экспортируемая), и что это за стандарт вызова?

5) Как передать из DLL указатель на класс, и использовать его из программы?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2013, 21:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Написание и использование DLL (C++):

Написание dll - библиотеки и ее открытие средствами Delphi - C++
Есть некоторая dll-библиотека, которая вычисляет площадь и периметр n-угольника. Лабораторная была на Delphi, решил попробовать написать...

Использование dll - C++
Доброго времени суток. Создал свою dll с единственной функцией Nod. Проблемма в том что вызов GetProcAddress(MyDLL,"Nod") не...

Использование dll в c++ - C++
Подскажите пожалуйста, как правильно создать и использовать dll библиотеку в c++? Делаю так. Создаю dll файл и ввожу в него следующий...

Использование vector в dll - C++
У меня есть такой вопрос. Допустим у нас в dll есть структура, vector состоит из набора этих структур. Есть функция которая возвращает...

Dll. Создание и использование - C++
Добрый вечер! Не порекомендуете хорошей литературы по созданию и использованию dll библиотек в Windows?

Создание и использование dll - C++
Нашел на MSDN как создавать dll, скомуниздил оттуда код, прошу пояснить, а так же необходимо найти ошибку, потому что работать оно не...

5
Dmitriy_M
1357 / 1240 / 114
Регистрация: 20.03.2009
Сообщений: 4,442
Записей в блоге: 11
28.07.2013, 21:34 #2
1. Таков формат dll, читаем подробности на MSDN
2. Использовать соглашение языка Си в именование функций и передаче параметров. Там много что может стоять.
3. Класс невозможно экспортировать. Экспортируются только функции(статические методы)
5. Никак. Иди учи паттерны.
1
h3mbr0
233 / 76 / 18
Регистрация: 12.03.2012
Сообщений: 327
28.07.2013, 21:42  [ТС] #3
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
1. Таков формат dll, читаем подробности на MSDN
2. Использовать соглашение языка Си в именование функций и передаче параметров. Там много что может стоять.
3. Класс невозможно экспортировать. Экспортируются только функции(статические методы)
5. Никак. Иди учи паттерны.
Спасибо за ответы, но хотелось бы уточнить
1. Что меняет DEF-файл, если в таблицу экспорта функцию добавляет _declspec(dllexport)?
2. Я так понимаю, для возможности использования библиотеки приложениями, написанных на разных языках? Тогда что значит это самая строка (вернее, что она меняет) ?
3. А как же http://msdn.microsoft.com/ru-ru/library/a90k134d%28v=vs.90%29.aspx
5. А разве не на таком принципе построен COM?
0
Убежденный
Ушел с форума
Эксперт С++
15690 / 7200 / 1138
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
28.07.2013, 22:53 #4
Цитата Сообщение от h3mbr0 Посмотреть сообщение
1) Почему без указания экспорта в DEF-файле, функцию нельзя "подцепить" с помощью GetProcAddress, при том, что она есть в таблице экспорта?
Потому что при экспорте с помощью DEF-файл имя функции попадает в секцию
экспорта без изменений. А при использовании, например, __declspec(dllexport)
имя искажается (декорация имен - name decoration или name mangling).
Смысл искажения имени - поддержка функций с одинаковыми именами, но
разным списком параметров (в С++). Сделать такое через DEF-файл нельзя.

Цитата Сообщение от h3mbr0 Посмотреть сообщение
2) Почему многие используют EXTERN_C(extern "C") перед описанием экспортируемой функцией?
Экспорт в стиле "С". При таком объявлении она экспортируется как C-функция, а
не как функция C++.

Цитата Сообщение от h3mbr0 Посмотреть сообщение
3) Какие функции экспортируются при экспорте всего класса?
Какие укажете, такие и будут экспортироваться.
Можно экспортировать весь класс, а можно только некоторые из методов.

Цитата Сообщение от h3mbr0 Посмотреть сообщение
(У меня экспортируется только одна, что она делает и почему не экспортируются остальные?
Не видя кода, можно только гадать.

Цитата Сообщение от h3mbr0 Посмотреть сообщение
Если добавить в класс string, в экспорт попадет еще несколько непонятных функций, почему?)
Каких, например ?
А вообще, string - это шаблон, он просто так не экспортируется, его еще
нужно инстанциировать.

Цитата Сообщение от h3mbr0 Посмотреть сообщение
4) Как расшифровывается название функции "??4CFoo@@QAEAAV0@ABV0@@Z"(та самая, единственная экспортируемая), и что это за стандарт вызова?
Зависит от компилятора. Между ними нет единого "мнения" по поводу того,
по каким правилам следует декорировать экспортируемые имена.

Цитата Сообщение от h3mbr0 Посмотреть сообщение
5) Как передать из DLL указатель на класс, и использовать его из программы?
С помощью оператора return.
1
Dmitriy_M
1357 / 1240 / 114
Регистрация: 20.03.2009
Сообщений: 4,442
Записей в блоге: 11
28.07.2013, 23:19 #5
Цитата Сообщение от h3mbr0 Посмотреть сообщение
2. Я так понимаю, для возможности использования библиотеки приложениями, написанных на разных языках? Тогда что значит это самая строка (вернее, что она меняет) ?
Есть куча нотаций, С++, Pascal и т.д.
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Вы определитесь что вы используете, раннее связывание или позднее. Если говорим о позднем связыванием и использование GetProcAddress/LoadLibrary то только функции.
Цитата Сообщение от h3mbr0 Посмотреть сообщение
5. А разве не на таком принципе построен COM?
COM это отдельная песня, а если хочешь создать систему плагинов, то используй паттерн фабрика и т.п.
1
h3mbr0
233 / 76 / 18
Регистрация: 12.03.2012
Сообщений: 327
28.07.2013, 23:52  [ТС] #6
Спасибо за ответы, вопросы более или менее отпали
Насчет экспорта класса:
Имея следующий код
C++
1
2
3
class  __declspec(dllexport) CFoo
{
};
В таблицу экспорта попадает функция "??4CFoo@@QAEAAV0@ABV0@@Z". За что она отвечает?
А изменить его вот так
C++
1
2
3
4
class  __declspec(dllexport) CFoo
{
    std::string Buf;
};
помимо уже описанной функции, в таблицу попадет еще 3 штуки "??0CFoo@@QAE@ABV0@@Z", "??0CFoo@@QAE@XZ", "??1CFoo@@QAE@XZ"
Логично было бы предположить, что они связаны с классом string, но почему только 3 и что они из себя представляют?

P.S компилятор mvc++ 2012

Добавлено через 10 минут
Есть куча нотаций, С++, Pascal и т.д.
Разве таблица экспортов не устанавливается стандартом PE? мне казалось, что различие только в соглашении вызова

Вы определитесь что вы используете, раннее связывание или позднее. Если говорим о позднем связыванием и использование GetProcAddress/LoadLibrary то только функции.
Насколько можно было понять из моих вопросов - я в этом деле не эксперт(а совсем даже наоборот), и не очень хорошо представляю себе "позднее связывание". Если не трудно, поясните как оно работает, и в чем различие, или хотя бы ссылочку на информацию дайте

COM это отдельная песня, а если хочешь создать систему плагинов, то используй паттерн фабрика и т.п.
Меня интересовал именно сам факт, а не система плагинов

Потому что при экспорте с помощью DEF-файл имя функции попадает в секцию
экспорта без изменений. А при использовании, например, __declspec(dllexport)
имя искажается (декорация имен - name decoration или name mangling).
Смысл искажения имени - поддержка функций с одинаковыми именами, но
разным списком параметров (в С++). Сделать такое через DEF-файл нельзя.
А разве _cdecl не дает такое же неискаженное имя при отсутствии параметров? И, выходит, использовать эту поддержку через GetProcAddress нельзя?

Экспорт в стиле "С". При таком объявлении она экспортируется как C-функция, а
не как функция C++.
Об этом я интуитивно догадался, но интересует меня различие между экспортами С и С++

Зависит от компилятора. Между ними нет единого "мнения" по поводу того,
по каким правилам следует декорировать экспортируемые имена.
Но ведь это записано в таблице экспорта, а ею пользуется уже не компилятор, значит должно быть какое-то согласование по этому поводу?

С помощью оператора return.
Передать я передал, а использовать не получается. Весьма вероятно, что это и логично, но почему - не имею понятия

Прошу прощение за такой поток вопросов, но меня очень интересует эта тема, и хотелось бы восполнить в ней все пробелы
0
28.07.2013, 23:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2013, 23:52
Привет! Вот еще темы с ответами:

Сборка и использование DLL - C++
Здравствуйте, я обучаюсь на программиста. Первый раз столкнулся со сборками с помощью Makefile. Где можно подробно ознакомится с...

ActiveX dll и ее использование - C++
Не могу понять в чем проблема. Создана dll в VB cde.dll, в которой есть форма Form1 и класс form_class, в классе реализована процедура ...

DLL in VC++. Создание, загрузка, использование. - C++
Как известно, в VC++ имеется несколько типов Dll: 1.Non-MFC DLLs; 2.Regular DLLs Statically Linked to MFC; 3.Regular DLLs Dynamically...

Использование STL в DLL-файлах - C++
Хочу использовать библиотеку STL в своем DLL-проекте. В частности для обеспечения функциональности требуется применение классов vector и...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru