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

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

Войти
Регистрация
Восстановить пароль
 
Mr. Hat
2 / 2 / 0
Регистрация: 17.02.2012
Сообщений: 68
#1

dll - C++

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

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

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

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

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

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

Dll файл в exe файле. Вшить dll libcurl - C++
Проблема такая что приходится таскать всегда libcurl.dll с собой. Надо все носить в одном exe. Enigma Virtual Box использовать нельзя,...

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

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

Цитата Сообщение от Mr. Hat Посмотреть сообщение
Есть ли возможность сделать библиотеку функций, чтобы ее можно было использовать в любой ОС, но так чтобы у пользователя библиотеки не было доступа к исходному коду?
Кросс-платформенная dll ? Только внутри линейки Windows.
0
Mr. Hat
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
Убежденный
Системный программист
Эксперт С++
15547 / 7055 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 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
Dr_Quake
Заблокирован
27.07.2013, 22:59 #5
Mr. Hat, тебе к Java...
0
Mr. Hat
2 / 2 / 0
Регистрация: 17.02.2012
Сообщений: 68
28.07.2013, 20:15  [ТС] #6
Цитата Сообщение от Убежденный Посмотреть сообщение
Не без некоторых дополнительных требований
Каких требований?
0
Убежденный
Системный программист
Эксперт С++
15547 / 7055 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2013, 23:12
Привет! Вот еще темы с ответами:

Как подключить dll на C# к проекту (dll) на С++ - C++
Подскажите, пожалуйста, как подключить dll на C# к проекту (dll) на С++. В интернете много примеров, где показаны примеры по подключению...

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

Вызов Dll-фий в другой Dll - C++
не получается дернуть dll в другой dll. Подскажите, как должен происходить вызов dll1 в dll2 ? (псевдокод) dll1.cpp { int...

Подгрузка dll через dll - C++
Доброго времени суток! Около двух часов потратил на поиски нужной информации, но так ничего и не нашёл. Возможно, плохо искал. Вообщем...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.07.2013, 23:12
Ответ Создать тему
Опции темы

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