![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| jhonyxakep |
|
|||
![]() Divide Et Impera ![]() ![]() Профиль Группа: Участник Сообщений: 983 Регистрация: 7.4.2009 Где: Что, Когда? Репутация: нет Всего: 8 |
Написал тестовую длл (функция string test(void); тупо возвращает строку "test,test":)) Решил динамически её импортировать из длл:
(код взят с инета) в результате я получаю фатальную ошибку (в прикреплении) Кстати это вторая моя попытка использовать динамическое подключение, и всегда такой результат. ЗЫ Юзаю extern "C" перед экспортом. |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
ты определись, что возвращает функция: строку или double.
Если в самой dll-ке строку, то понятно, почему не работает -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| ThisIsSparta |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 29.7.2009 Репутация: нет Всего: нет |
Если extern "C", то имя функции должно быть примерно таким: "_test@0".
Попробуй так:
EDIT: в dll функция должна быть проэкспортирована:
Это сообщение отредактировал(а) ThisIsSparta - 27.2.2010, 19:29 |
||||
|
|||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
ThisIsSparta, extern "C" как раз указывает, что функция не должна декорироваться
а твой пример: extern "C" string void ... не будет компилироваться -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| ThisIsSparta |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 29.7.2009 Репутация: нет Всего: нет |
Хм. Пример-то скомпилировался, но с предупреждением "'identifier1' has C-linkage specified, but returns UDT 'identifier2' which is incompatible with C ".
Мда... Действительно имя задается как есть, но... Почему я ошибся? Просто недавно тоже экспериментировал с линковками, но экспериментировал с __stdcall-функциями. В __cdecl все происходит так, как Вы сказали - имя не декодируется. А что будет, если попробовать вот такую функцию?
Она будет проэкспортирована с именем:
8 - это выравнивание стека. Хотя сильно во всю эту радость не влазил. Возможно, это просто особенности линкера MSVC... |
||||
|
|||||
| jhonyxakep |
|
||||
![]() Divide Et Impera ![]() ![]() Профиль Группа: Участник Сообщений: 983 Регистрация: 7.4.2009 Где: Что, Когда? Репутация: нет Всего: 8 |
ThisIsSparta, действительно я для того и ставил extern "C" что бы функция была более менее красивого вида. Добавлено через 1 минуту и 26 секунд
А я что, не экспортирую???
|
||||
|
|||||
| jhonyxakep |
|
|||
![]() Divide Et Impera ![]() ![]() Профиль Группа: Участник Сообщений: 983 Регистрация: 7.4.2009 Где: Что, Когда? Репутация: нет Всего: 8 |
||||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
ThisIsSparta, Имя __cdecl и __stdcall функций, объявленных в msvc как extern "C" отличаются только подчеркиванием в начале
jhonyxakep, очень не советую экспортировать из длл-ки stl-классы, т.к. они будут вылетать (и это в лучшем случае), если ты будешь использовать их в программе, откомпилированной другим компилятором или даже тем же компилятором, но с другой версией stl Это сообщение отредактировал(а) borisbn - 28.2.2010, 06:51 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Это С (__stdcall), а 8 - это размер аргументов на стеке.
|
||||
|
|||||
| jhonyxakep |
|
|||
![]() Divide Et Impera ![]() ![]() Профиль Группа: Участник Сообщений: 983 Регистрация: 7.4.2009 Где: Что, Когда? Репутация: нет Всего: 8 |
||||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |