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

dll - C++

Восстановить пароль Регистрация
 
Mr. Hat
2 / 2 / 0
Регистрация: 17.02.2012
Сообщений: 63
27.07.2013, 18:35     dll #1
1. Можно ли использовать DLL, созданную на одном языке программирования в программе на другом языке?
2. Я так понял, DLL работает только под Windows. Есть ли возможность сделать библиотеку функций, чтобы ее можно было использовать в любой ОС, но так чтобы у пользователя библиотеки не было доступа к исходному коду?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.07.2013, 18:35     dll
Посмотрите здесь:

DLL C++
dLL C++
C++ Загрузка переменной из DLL (GetProcAddress не берет значение переменной из *.dll)
Подгрузка dll через dll C++
C++ dll и h
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14209 / 6224 / 987
Регистрация: 02.05.2013
Сообщений: 10,374
Завершенные тесты: 1
27.07.2013, 18:38     dll #2
Цитата Сообщение от Mr. Hat Посмотреть сообщение
1. Можно ли использовать DLL, созданную на одном языке программирования в программе на другом языке?
Можно. Если использовать экспорт в стиле C. Например, как это делается в
стандартных библиотеках Windows - kernel32.dll, user32.dll и т.п.
Если нужно что-то посложнее, тогда путь один - использовать технологию COM.

Цитата Сообщение от Mr. Hat Посмотреть сообщение
Есть ли возможность сделать библиотеку функций, чтобы ее можно было использовать в любой ОС, но так чтобы у пользователя библиотеки не было доступа к исходному коду?
Кросс-платформенная dll ? Только внутри линейки Windows.
Mr. Hat
2 / 2 / 0
Регистрация: 17.02.2012
Сообщений: 63
27.07.2013, 19:54  [ТС]     dll #3
Цитата Сообщение от Убежденный Посмотреть сообщение
Можно. Если использовать экспорт в стиле C. Например, как это делается в
стандартных библиотеках Windows - kernel32.dll, user32.dll и т.п.
Если нужно что-то посложнее, тогда путь один - использовать технологию COM.
Что такое экспорт в стиле C? Это метод написания функций в самой dll? Если библиотека изначально создавалась на другом языке, и нет возможности ее перепрограммировать, то этот способ не сработает?
Ну допустим, мы можем перепрограммировать dll. Поможет ли экспорт в стиле с использовать dll, написанную на C++, в фортрановской программе? Или наоборот - фортрановскую dll в программе на c++?
И существует ли кроссплатформенный аналог COM?
Цитата Сообщение от Убежденный Посмотреть сообщение
Кросс-платформенная dll ? Только внутри линейки Windows.
Ну, не обязательно dll. И библиотека необязательно динамическая. Неужели нет кросс-платформенного решения? Почему необходимо привязываться к конкретной ОС, если в библиотеке не используются никакие функции API ОС?
Убежденный
Системный программист
 Аватар для Убежденный
14209 / 6224 / 987
Регистрация: 02.05.2013
Сообщений: 10,374
Завершенные тесты: 1
27.07.2013, 20:31     dll #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 ОС?
Разные типы и размеры типов, разные соглашения о вызовах, разный порядок байт,
разные форматы исполняемых файлов... Да много чего еще.
Dr_Quake
Заблокирован
27.07.2013, 22:59     dll #5
Mr. Hat, тебе к Java...
Mr. Hat
2 / 2 / 0
Регистрация: 17.02.2012
Сообщений: 63
28.07.2013, 20:15  [ТС]     dll #6
Цитата Сообщение от Убежденный Посмотреть сообщение
Не без некоторых дополнительных требований
Каких требований?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2013, 23:12     dll
Еще ссылки по теме:

C++ Вызов dll ресурсов в dll
Загрузка 32 bit DLL в 64 bit DLL C++
C++ Вызов Dll-фий в другой Dll

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

Или воспользуйтесь поиском по форуму:
Убежденный
Системный программист
 Аватар для Убежденный
14209 / 6224 / 987
Регистрация: 02.05.2013
Сообщений: 10,374
Завершенные тесты: 1
28.07.2013, 23:12     dll #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-аллокатор не найдет
информации о данном блоке в своих таблицах, в результате чего произойдет ошибка.
Yandex
Объявления
28.07.2013, 23:12     dll
Ответ Создать тему
Опции темы

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