Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.06.2011, 16:53   #1
Jetro
Пользователь
 
Регистрация: 15.11.2010
Сообщений: 31
По умолчанию Использование библиотек (dll) в RAD Studio, написанных в Delphi 7

В общем ситуация такая - нужно использовать библиотеку написанную в Delphi 7, возвращаемое значение это запись типа Record, внутри которого несколько значений типа String, и несколько Integer.
Подключение библиотеки производится обычным подключением функции.

Программа:
Код:
type
TNewData = Record
aaa : String;
bbb : String;
ccc : String;
xxx : Integer;
yyy : Integer;
zzz : Integer;
End;

TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  NewData : TNewData ;

function SendData(): NewData ; external 'lib.DLL';

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
NewData := SendData();

with Listbox1.Items do
begin
add(NewData.aaa);
add(NewData.bbb);
add(NewData.ccc);
add(inttostr(NewData.xxx));
add(inttostr(NewData.yyy));
add(inttostr(NewData.zzz));
end;
end;

end.
Библиотека:
Цитата:
library lib;

uses
SysUtils,
Classes;

type
TNewData = Record
aaa : String;
bbb : String;
ccc : String;
xxx : Integer;
yyy : Integer;
zzz : Integer;
End;

{$R *.res}


function SendData() : TNewData; export;
var
NewData : TNewData;
begin
NewData .aaa := 'one';
NewData .bbb := 'two';
NewData .ccc := 'three';
NewData .xxx := '1';
NewData .yyy := '2';
NewData .zzz := '3';

result := NewData;
end;

exports
SendData;

end.
А теперь самая суть проблемы:
- Компилируем программу и библиотеку в Delphi 2010 - все данные из библиотеки получаем без проблем
- Компилируем программу и библиотеку в Delphi 7 - все данные из библиотеки получаем без проблем
- Компилируем программу в Delphi 2010, библиотеку в Delphi 7 - при вызове функции библиотеки получаем ексепшн с ошибкой чтения нулевой строки, при этом значения типа Integer получаем без проблем.

В чем проблема?

P.S. Советы типа "Пиши все на одной версии" прошу не давать - не могу я так сделать, мне нужно сделать именно так как я описал, по причине, которую я огласить не могу.
Jetro вне форума Ответить с цитированием
Старый 25.06.2011, 17:01   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)в болванке ДЛЛ для кого комментарий про тип string?
2)Д7 string= Д2009+ AnsiString
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.06.2011, 22:16   #3
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Замените String на WideString в TNewData.

А автора оригинального кода пристрелите. Он не работает даже когда DLL и .exe собраны в одной версии. И вот почему.

Но если закрыть на это глаза, то исходный вопрос звучит так: как открыть дверь, не открывая дверь? Потому что как только вы говорите "String" - вы говорите "все модули собраны в одной версии компилятора". Потому что String - это тип Delphi, реализация которого зависит от компилятора (кстати, Пепел Феникса наврал: Д7 string <> Д2009+ AnsiString).

WideString же характеризуется тем, что это системный тип (BSTR в терминах винды), поэтому он не зависит от компилятора Delphi. Более того, работа с ним всегда осуществляется через системный менеджер памяти, поэтому он позволяет избегать проблем, указанных в абзаце со ссылками.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 25.06.2011, 22:23   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

P.S. Кстати, хорошим стилем является вынесение общих данных в отдельный модуль. Чтобы не получилось ситуации, когда в DLL структуры изменили, а в .exe - забыли (или наоборот).
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 25.06.2011, 23:14   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
(кстати, Пепел Феникса наврал: Д7 string <> Д2009+ AnsiString)
ну не совсем, я более имел в виду что они имеют больше общего чем String из ЮникодДелфей и String из АнсиДелфей.
правда не уточнил про это
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.06.2011, 23:27   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Бывает.....
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 29.06.2011, 12:16   #7
Jetro
Пользователь
 
Регистрация: 15.11.2010
Сообщений: 31
По умолчанию

Хм, я думал что отписался в субботу, но похоже пост написал, но так замотался что кнопку "Отправить" нажать забыл.

В общем забыл я совсем о том что последние версии Делфей на юникод перенесли, при чем об этом отлично знал, а тут просто из головы вылетело. Забыл что теперь "String = WideString", а не как раньше "String = AnsiString" но "WideString <> AnsiString". Кстати на сколько я знаю это появилось не в Д2009+, а в Д2006+ (хотя могу и ошибаться).

Спасибо за помощь. Проблему решил так - в программе (скомпилированной на Д2010) поставил AnsiString, а в библиотеке (скомпилированной на Д7) поставил WideString. По другом работать отказывалось - то с кодировкой проблемы были, то возвращалось пустое значение.
Jetro вне форума Ответить с цитированием
Старый 29.06.2011, 15:30   #8
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Это еще цветочки)
Ждут тебя другие грабли, большие и малые, потому что ты напрочь проигнорировал здоровущий коммент в dll-болванке.
mss вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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