2 / 2 / 0
Регистрация: 17.02.2012
Сообщений: 68
|
|
1 | |
dll27.07.2013, 18:35. Показов 1004. Ответов 6
Метки нет (Все метки)
1. Можно ли использовать DLL, созданную на одном языке программирования в программе на другом языке?
2. Я так понял, DLL работает только под Windows. Есть ли возможность сделать библиотеку функций, чтобы ее можно было использовать в любой ОС, но так чтобы у пользователя библиотеки не было доступа к исходному коду?
0
|
27.07.2013, 18:35 | |
Ответы с готовыми решениями:
6
Добавление своей dll в список dll подгружаемых процессом чужого процесса Точка входа в процедуру InterlockedCompareExchange64 не найдена в библиотеке DLL KERNEL32.DLL Запись из внедренной dll в другую dll этого процесса Dll файл в exe файле. Вшить dll libcurl |
Ушел с форума
|
|
27.07.2013, 18:38 | 2 |
Можно. Если использовать экспорт в стиле C. Например, как это делается в
стандартных библиотеках Windows - kernel32.dll, user32.dll и т.п. Если нужно что-то посложнее, тогда путь один - использовать технологию COM. Кросс-платформенная dll ? Только внутри линейки Windows.
0
|
2 / 2 / 0
Регистрация: 17.02.2012
Сообщений: 68
|
|
27.07.2013, 19:54 [ТС] | 3 |
Что такое экспорт в стиле C? Это метод написания функций в самой dll? Если библиотека изначально создавалась на другом языке, и нет возможности ее перепрограммировать, то этот способ не сработает?
Ну допустим, мы можем перепрограммировать dll. Поможет ли экспорт в стиле с использовать dll, написанную на C++, в фортрановской программе? Или наоборот - фортрановскую dll в программе на c++? И существует ли кроссплатформенный аналог COM? Ну, не обязательно dll. И библиотека необязательно динамическая. Неужели нет кросс-платформенного решения? Почему необходимо привязываться к конкретной ОС, если в библиотеке не используются никакие функции API ОС?
0
|
Ушел с форума
|
|
27.07.2013, 20:31 | 4 |
Сообщение было отмечено как решение
Решение
Упрощенно говоря, это экспорт только C-шных программных интерфейсов (функции + переменные).
Дело в том, что программный интерфейс самой Windows является C-шным и любой язык/компилятор, если он хочет быть популярным под эту платформу, должен по меньшей мере уметь вызывать C-шные функции из dll. То есть, интерфейсы в стиле C являются переносимыми внутри Windows. А вот про C++ такого сказать, к сожалению, нельзя. Если, например, конструктор некоего класса внутри dll кидает исклюение std::runtime_error, как должен реагировать на него вызывающий код, написанный на Delphi, к примеру ? Или на VBA, где нет понятия конструкторов/деструкторов ? Это называется двоичная несовместимость. Даже между компиляторами C++ она практически отсутствует. Поэтому если вы хотите что-то экспортировать из dll относительно переносимым образом, выбор невелик - или экспорт в стиле C, который поддерживается всеми популярными компиляторами, или использование COM. Не без некоторых дополнительных требований. Но в целом - да, поможет. XPCOM. Ну еще CORBA можно вспомнить, хотя это из немного другой "оперы". Разные типы и размеры типов, разные соглашения о вызовах, разный порядок байт, разные форматы исполняемых файлов... Да много чего еще.
3
|
2 / 2 / 0
Регистрация: 17.02.2012
Сообщений: 68
|
|
28.07.2013, 20:15 [ТС] | 6 |
0
|
Ушел с форума
|
|
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 | |
28.07.2013, 23:12 | |
Помогаю со студенческими работами здесь
7
Как узнать путь к загруженной DLL из самой DLL? Отсутствует libstdc++-6.dll и libgcc_s_sjlj-1.dll при компиляции Как узнать зависимость DLL-ки от других DLL-ек? Обращение к ресурсам DLL из самой DLL Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |