Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
2 / 2 / 0
Регистрация: 17.02.2012
Сообщений: 68
1

dll

27.07.2013, 18:35. Показов 1004. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
1. Можно ли использовать DLL, созданную на одном языке программирования в программе на другом языке?
2. Я так понял, DLL работает только под Windows. Есть ли возможность сделать библиотеку функций, чтобы ее можно было использовать в любой ОС, но так чтобы у пользователя библиотеки не было доступа к исходному коду?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.07.2013, 18:35
Ответы с готовыми решениями:

Добавление своей dll в список dll подгружаемых процессом чужого процесса
Вообще вопрос такой,как можно внедрить свою dll в список Import чужого не запущенного процесса?Не...

Точка входа в процедуру InterlockedCompareExchange64 не найдена в библиотеке DLL KERNEL32.DLL
День добрый! При запуске моей программы (много моего кода + много разных сторонних dll) на WinXP...

Запись из внедренной dll в другую dll этого процесса
main.cpp #include <Windows.h> extern int writeprocess(); DWORD WINAPI MainThread(LPVOID...

Dll файл в exe файле. Вшить dll libcurl
Проблема такая что приходится таскать всегда libcurl.dll с собой. Надо все носить в одном exe....

6
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
27.07.2013, 18:38 2
Цитата Сообщение от Mr. Hat Посмотреть сообщение
1. Можно ли использовать DLL, созданную на одном языке программирования в программе на другом языке?
Можно. Если использовать экспорт в стиле C. Например, как это делается в
стандартных библиотеках Windows - kernel32.dll, user32.dll и т.п.
Если нужно что-то посложнее, тогда путь один - использовать технологию COM.

Цитата Сообщение от Mr. Hat Посмотреть сообщение
Есть ли возможность сделать библиотеку функций, чтобы ее можно было использовать в любой ОС, но так чтобы у пользователя библиотеки не было доступа к исходному коду?
Кросс-платформенная dll ? Только внутри линейки Windows.
0
2 / 2 / 0
Регистрация: 17.02.2012
Сообщений: 68
27.07.2013, 19:54  [ТС] 3
Цитата Сообщение от Убежденный Посмотреть сообщение
Можно. Если использовать экспорт в стиле C. Например, как это делается в
стандартных библиотеках Windows - kernel32.dll, user32.dll и т.п.
Если нужно что-то посложнее, тогда путь один - использовать технологию COM.
Что такое экспорт в стиле C? Это метод написания функций в самой dll? Если библиотека изначально создавалась на другом языке, и нет возможности ее перепрограммировать, то этот способ не сработает?
Ну допустим, мы можем перепрограммировать dll. Поможет ли экспорт в стиле с использовать dll, написанную на C++, в фортрановской программе? Или наоборот - фортрановскую dll в программе на c++?
И существует ли кроссплатформенный аналог COM?
Цитата Сообщение от Убежденный Посмотреть сообщение
Кросс-платформенная dll ? Только внутри линейки Windows.
Ну, не обязательно dll. И библиотека необязательно динамическая. Неужели нет кросс-платформенного решения? Почему необходимо привязываться к конкретной ОС, если в библиотеке не используются никакие функции API ОС?
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
27.07.2013, 20:31 4
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Mr. Hat Посмотреть сообщение
Что такое экспорт в стиле C? Это метод написания функций в самой dll?
Упрощенно говоря, это экспорт только C-шных программных интерфейсов (функции + переменные).
Дело в том, что программный интерфейс самой Windows является C-шным и любой язык/компилятор,
если он хочет быть популярным под эту платформу, должен по меньшей мере уметь вызывать
C-шные функции из dll. То есть, интерфейсы в стиле C являются переносимыми внутри Windows.
А вот про C++ такого сказать, к сожалению, нельзя. Если, например, конструктор некоего класса
внутри dll кидает исклюение std::runtime_error, как должен реагировать на него вызывающий код,
написанный на Delphi, к примеру ? Или на VBA, где нет понятия конструкторов/деструкторов ?
Это называется двоичная несовместимость. Даже между компиляторами C++ она практически отсутствует.
Поэтому если вы хотите что-то экспортировать из dll относительно переносимым образом, выбор
невелик - или экспорт в стиле C, который поддерживается всеми популярными компиляторами, или
использование COM.

Цитата Сообщение от Mr. Hat Посмотреть сообщение
Ну допустим, мы можем перепрограммировать dll. Поможет ли экспорт в стиле с использовать dll, написанную на C++, в фортрановской программе? Или наоборот - фортрановскую dll в программе на c++?
Не без некоторых дополнительных требований. Но в целом - да, поможет.

Цитата Сообщение от Mr. Hat Посмотреть сообщение
И существует ли кроссплатформенный аналог COM?
XPCOM. Ну еще CORBA можно вспомнить, хотя это из немного другой "оперы".

Цитата Сообщение от Mr. Hat Посмотреть сообщение
Ну, не обязательно dll. И библиотека необязательно динамическая. Неужели нет кросс-платформенного решения? Почему необходимо привязываться к конкретной ОС, если в библиотеке не используются никакие функции API ОС?
Разные типы и размеры типов, разные соглашения о вызовах, разный порядок байт,
разные форматы исполняемых файлов... Да много чего еще.
3
Заблокирован
27.07.2013, 22:59 5
Mr. Hat, тебе к Java...
0
2 / 2 / 0
Регистрация: 17.02.2012
Сообщений: 68
28.07.2013, 20:15  [ТС] 6
Цитата Сообщение от Убежденный Посмотреть сообщение
Не без некоторых дополнительных требований
Каких требований?
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
28.07.2013, 23:12 7
Mr. Hat, можно брать пример с Win32 API:

1) Функции и переменные должны экспортироваться только с помощью DEF-файла.
При использовании DEF-файла экспортируемые символы не декорируются, то есть, функция
DoSomething будет записана в секцию экспорта, как DoSomething, а не _DoSomething@8 или
??8CDoSomething@DAEE@F0GDE@8. Соответственно, ее смогут найти и вызвать практически
любые компиляторы - С/C++, Delphi, .NET, VBA и т.д.

2) Должны использоваться только совместимые соглашения о вызовах (calling convention).
Лучше всего - stdcall. Это наиболее стандартное соглашение.

3) Должны использоваться типы фиксированных и четко определенных размеров.
Например, в C++ bool занимает 1 байт, есть также BOOL в 4 байта и BOOLEAN в 1 байта, а
еще тип VARIANT_BOOL размером в 2 байта, в котором "истине" соответствует 0xFFFF.
В VC++ wchar_t равен 2 байтам, в MinGW - 4. И так далее.

4) Должны использоваться единые настройки выравнивания (#pragma pack).

5) Память под объект должна освобождаться в том же модуле (exe/dll), в котором была выделена.
Выделить память под объект в exe, а затем освободить ее в dll - ошибка. Тут дело даже не в
том, что используются разные среды или компиляторы, - подобную ошибку можно легко получить в
пределах одной версии компилятора, - а в том, что обычно у каждого модуля своя копия аллокатора
(для malloc/free) и одни аллокаторы "не знают" о блоках памяти, выделенных другими.
То есть, когда вы в exe освобождаете память, выделенную в dll, то exe-аллокатор не найдет
информации о данном блоке в своих таблицах, в результате чего произойдет ошибка.
1
28.07.2013, 23:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.07.2013, 23:12
Помогаю со студенческими работами здесь

Как узнать путь к загруженной DLL из самой DLL?
Создаю небольшую программку в папке c:/test/app/, есть DLL в папке c:/test/dll/. В коде самой...

Отсутствует libstdc++-6.dll и libgcc_s_sjlj-1.dll при компиляции
Открыл на ноутбуке VS 2019, ни одна программа не компилируется, выдает ошибку с отсутствием файлов...

Как узнать зависимость DLL-ки от других DLL-ек?
Есть DLL-ка, она в свою очередь подгружает другие DLL-ки, а так же использует соответственно...

Обращение к ресурсам DLL из самой DLL
Коллеги, добрый день. Получил следующее задание - Создать библиотеку, DLL назначение которой,...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru