![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 | |
Пользователь
Регистрация: 15.11.2010
Сообщений: 31
|
![]()
В общем ситуация такая - нужно использовать библиотеку написанную в Delphi 7, возвращаемое значение это запись типа Record, внутри которого несколько значений типа String, и несколько Integer.
Подключение библиотеки производится обычным подключением функции. Программа: Код:
Цитата:
- Компилируем программу и библиотеку в Delphi 2010 - все данные из библиотеки получаем без проблем - Компилируем программу и библиотеку в Delphi 7 - все данные из библиотеки получаем без проблем - Компилируем программу в Delphi 2010, библиотеку в Delphi 7 - при вызове функции библиотеки получаем ексепшн с ошибкой чтения нулевой строки, при этом значения типа Integer получаем без проблем. В чем проблема? P.S. Советы типа "Пиши все на одной версии" прошу не давать - не могу я так сделать, мне нужно сделать именно так как я описал, по причине, которую я огласить не могу. |
|
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
1)в болванке ДЛЛ для кого комментарий про тип string?
2)Д7 string= Д2009+ AnsiString Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
![]()
Замените String на WideString в TNewData.
А автора оригинального кода пристрелите. Он не работает даже когда DLL и .exe собраны в одной версии. И вот почему. Но если закрыть на это глаза, то исходный вопрос звучит так: как открыть дверь, не открывая дверь? Потому что как только вы говорите "String" - вы говорите "все модули собраны в одной версии компилятора". Потому что String - это тип Delphi, реализация которого зависит от компилятора (кстати, Пепел Феникса наврал: Д7 string <> Д2009+ AnsiString). WideString же характеризуется тем, что это системный тип (BSTR в терминах винды), поэтому он не зависит от компилятора Delphi. Более того, работа с ним всегда осуществляется через системный менеджер памяти, поэтому он позволяет избегать проблем, указанных в абзаце со ссылками.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
![]()
P.S. Кстати, хорошим стилем является вынесение общих данных в отдельный модуль. Чтобы не получилось ситуации, когда в DLL структуры изменили, а в .exe - забыли (или наоборот).
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
![]() |
![]() |
![]() |
#5 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Цитата:
правда не уточнил про это ![]() Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
![]()
Бывает.....
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 15.11.2010
Сообщений: 31
|
![]()
Хм, я думал что отписался в субботу, но похоже пост написал, но так замотался что кнопку "Отправить" нажать забыл.
В общем забыл я совсем о том что последние версии Делфей на юникод перенесли, при чем об этом отлично знал, а тут просто из головы вылетело. Забыл что теперь "String = WideString", а не как раньше "String = AnsiString" но "WideString <> AnsiString". Кстати на сколько я знаю это появилось не в Д2009+, а в Д2006+ (хотя могу и ошибаться). Спасибо за помощь. Проблему решил так - в программе (скомпилированной на Д2010) поставил AnsiString, а в библиотеке (скомпилированной на Д7) поставил WideString. По другом работать отказывалось - то с кодировкой проблемы были, то возвращалось пустое значение. |
![]() |
![]() |
![]() |
#8 |
Заблокирован
Регистрация: 27.05.2010
Сообщений: 1,099
|
![]()
Это еще цветочки)
Ждут тебя другие грабли, большие и малые, потому что ты напрочь проигнорировал здоровущий коммент в dll-болванке. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Rad Studio 2011 XE: новое в Delphi, C++ Builder, RadPHP и Delphi Prism | savva-paladin | Софт | 18 | 02.10.2010 20:24 |
Использование библиотек в Delphi | Konstantin_V | Софт | 31 | 22.02.2010 21:59 |
Совместимость различных библиотек с CodeGear RAD Studio 2010 | Mister Moonlight | Софт | 0 | 08.09.2009 11:53 |
Создание\использование своих DLL библиотек | Vol666 | Общие вопросы Delphi | 5 | 26.08.2009 11:55 |
Delphi, Rad Studio 2009 | mutabor | Софт | 5 | 24.05.2009 14:34 |