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

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

Восстановить пароль Регистрация
 
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
28.07.2013, 21:08     Написание и использование DLL #1
Доброго времени суток!

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

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

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

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

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

Сборка и использование DLL C++
C++ Использование dll
C++ DLL in VC++. Создание, загрузка, использование.
ActiveX dll и ее использование C++
Написание dll - библиотеки и ее открытие средствами Delphi C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,208
Записей в блоге: 11
28.07.2013, 21:34     Написание и использование DLL #2
1. Таков формат dll, читаем подробности на MSDN
2. Использовать соглашение языка Си в именование функций и передаче параметров. Там много что может стоять.
3. Класс невозможно экспортировать. Экспортируются только функции(статические методы)
5. Никак. Иди учи паттерны.
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
28.07.2013, 21:42  [ТС]     Написание и использование DLL #3
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
1. Таков формат dll, читаем подробности на MSDN
2. Использовать соглашение языка Си в именование функций и передаче параметров. Там много что может стоять.
3. Класс невозможно экспортировать. Экспортируются только функции(статические методы)
5. Никак. Иди учи паттерны.
Спасибо за ответы, но хотелось бы уточнить
1. Что меняет DEF-файл, если в таблицу экспорта функцию добавляет _declspec(dllexport)?
2. Я так понимаю, для возможности использования библиотеки приложениями, написанных на разных языках? Тогда что значит это самая строка (вернее, что она меняет) ?
3. А как же http://msdn.microsoft.com/ru-ru/libr...=vs.90%29.aspx
5. А разве не на таком принципе построен COM?
Убежденный
Системный программист
 Аватар для Убежденный
14193 / 6208 / 985
Регистрация: 02.05.2013
Сообщений: 10,343
Завершенные тесты: 1
28.07.2013, 22:53     Написание и использование DLL #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.
Dmitriy_M
1294 / 1175 / 104
Регистрация: 20.03.2009
Сообщений: 4,208
Записей в блоге: 11
28.07.2013, 23:19     Написание и использование DLL #5
Цитата Сообщение от h3mbr0 Посмотреть сообщение
2. Я так понимаю, для возможности использования библиотеки приложениями, написанных на разных языках? Тогда что значит это самая строка (вернее, что она меняет) ?
Есть куча нотаций, С++, Pascal и т.д.
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Вы определитесь что вы используете, раннее связывание или позднее. Если говорим о позднем связыванием и использование GetProcAddress/LoadLibrary то только функции.
Цитата Сообщение от h3mbr0 Посмотреть сообщение
5. А разве не на таком принципе построен COM?
COM это отдельная песня, а если хочешь создать систему плагинов, то используй паттерн фабрика и т.п.
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
28.07.2013, 23:52  [ТС]     Написание и использование DLL #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.
Передать я передал, а использовать не получается. Весьма вероятно, что это и логично, но почему - не имею понятия

Прошу прощение за такой поток вопросов, но меня очень интересует эта тема, и хотелось бы восполнить в ней все пробелы
Yandex
Объявления
28.07.2013, 23:52     Написание и использование DLL
Ответ Создать тему
Опции темы

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