![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| VanHelsing |
|
||||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Мне необходимо из длл биб-ки написанной на си вызвать процедуру,которая имеет следующее описание [color=red]
Подскажите пожалуйста как преобразовать эту процедуру из с++ в делфи делаю так
ничего не получается(( |
||||
|
|||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
>__declspec(dllexport) void Spisok_master(std::string** str_mass);
Передача объекта за границу модуля, такое даже на стыке С++ легко может привести к непредсказуемым результатам, тем более при использовании разных языков. Передавайте либо COM строки, либо простые типы, например const wchar_t* , если массив строк, то const wchar_t** иначе беда. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 7 Всего: 41 |
Я не знаю как правильно это перевести, но где сказано про 6-ти элементный массив???
Попробуй так:
Это сообщение отредактировал(а) Чучмек - 19.10.2011, 12:21 -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| VanHelsing |
|
||||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Дело в том что редактировать библиотеку я не могу, ее писал другой человек и мне ее необходимо использовать в своей программе.
Это я просто экспериментировал, а изначально я пробовал
И при выполнении экспортируемой процедуры Spisok_master возникает Access violation. |
||||
|
|||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Тогда единственный вариант, узнать в какой среде была написана библиотека и разобрать бинарную структуру объекта, после чего написать readonly wraper класса на стороне делфи. Объекты для этих целей не подойдут, поскольку в делфи VMT запихивается по умолчанию, значит нужно написать record с методами доступа к полям данных. Важно чтобы размеры рекорда совпадали с размером объекта std::string в реализации той среды в которой она была скомпилирована. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| VanHelsing |
|
|||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Если я правильно понял, то при данном раскладе мне реализовать нормальную работу не получился? |
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 7 Всего: 41 |
А функция вообще что нибудь возвращает?
Изменится значение в m[0] ? -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
В режиме только для чтения получиться, может еще заменять одни символы другими, усекать размер строки. Короче все что НЕ связанно с перераспределением памяти можно будет решить. Не получиться выделить место в с++ либе и освободить в проге на делфи и наоборот. И еще, чего вы решили что С++ использует по умолчанию соглашение stdcall ? Напротив, по умолчанию принято cdecl . При наличии времени и терпения можно нагородить много чудес. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| VanHelsing |
|
||||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Как я понимаю в качестве параметра должен передаваться указатель на массив указателей?
Eclipse |
||||
|
|||||
| Alexeis |
|
||||||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Примерно так будет правильно в делфи
Для начала нужно узнать размер std::string в эклипсе, точнее в том SDK, которое используется с эклипсом. Вот например структура std::string в билдере. Повторить такое в делфи с не составит труда.
итого 40 байт. Это сообщение отредактировал(а) Alexeis - 20.10.2011, 09:35 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||||
|
|||||||
| alexSl |
|
|||
![]() проходил мимо Профиль Группа: Участник Сообщений: 28 Регистрация: 22.2.2008 Репутация: нет Всего: нет |
||||
|
||||
| CROTishka |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 192 Регистрация: 30.7.2009 Репутация: нет Всего: 2 |
Можно, всё можно. Про calling conventions здесь уже написали, это раз. Второе, прочитайте статью "Использование в Delphi классов, созданных в Visual C++" - она на многих ресурсах в сети растиражирована. Третье: что у вас делает string?!?!? String(in the default {$H+} state is AnsiString) это уникальный дельфёвый тип. Ни в одном из других языков нет аналогов, везде используются null-terminated strings (PChar). Третье, выставите выравнивание ("record field alignment") в своем проекте такое же, как в библиотеке, иначе у вас всё поедет. (ещё может быть вам стоит packed record использовать?) И будет вам счастье. если что-то не получается - опишите тут подробно, что уже сделали, что получается вместо того, что бы вам хотелось (подробно). А после всего этого у**ите того, кто писал эту сишную библиотеку тапкой и заставьте обернуть всё по-человечески в COM, и не парить вам мозги. Ибо если у вас это и будет работать, то на другой машине с другой битностью винды и/или процессора может не заработать. Не заставляйте мучиться себя, ваших клиентов, и тех, кто после вас будет поддерживать этот ужасный код. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |