Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
Ural2
Member

Откуда:
Сообщений: 58
Был проект: программа на delhhi 2007 + dll на delhhi 2007. Программу перевели на delhhi XE3, dll перевести нельзя (сторонний разработчик).
dll в головную программу передает данные, в том числе типа string. Получаю строки в виде крокозябр Картинка с другого сайта..
Перечитала кучу документации по приведению типов и кодировок, сотни попыток - все безрезультатно...
Помогите, люди добрые!

К сообщению приложен файл. Размер - 308bytes
20 апр 19, 21:54    [21867931]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
shonli95
Member

Откуда:
Сообщений: 85
string в d7 это ansistring когда в xe+ это уже utf16 следовательно ты понял
20 апр 19, 21:59    [21867933]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 47660

Ural2
dll в головную программу передает данные, в том числе типа string.

Точно String, а не PAnsiChar? Если да, тогда лучше сразу забудь о переходе на ХЕ3.

Posted via ActualForum NNTP Server 1.5

20 апр 19, 22:05    [21867935]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
shonli95
Member

Откуда:
Сообщений: 85
Dimitry Sibiryakov,

а какие проблемы могут быть с pansichar ? Это же всего лишь массив байт, который кончается на #0
20 апр 19, 22:37    [21867944]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
Ural2
Member

Откуда:
Сообщений: 58
shonli95
string в d7 это ansistring когда в xe+ это уже utf16 следовательно ты понял

Пока нет. Все еще пытаюсь найти способ преобразования. Или, как говорит Dimitry Sibiryakov, дело - труба?
20 апр 19, 22:50    [21867953]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 47660

shonli95
а какие проблемы могут быть с pansichar ?

Вот с ним-то как раз проблем быть не должно.

Posted via ActualForum NNTP Server 1.5

21 апр 19, 00:08    [21867985]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
shonli95
Member

Откуда:
Сообщений: 85
Ural2
Пока нет. Все еще пытаюсь найти способ преобразования.


Как это нет? Всё логично

pchar=pAnsiChar
string=AnsiString

Это не способ преобразования, это способ получения строки определённого формата. Я не думаю, что там используется string по причине того, что библиотеку можно сразу выбросить
21 апр 19, 00:26    [21867998]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
rgreat
Member

Откуда:
Сообщений: 5070
Dimitry Sibiryakov
Если да, тогда лучше сразу забудь о переходе на ХЕ3.
Что мешает сменить String на AnsiString?
21 апр 19, 01:19    [21868012]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3543
rgreat
Что мешает сменить String на AnsiString?

Coe Page Aware после D2009 мешает. А вообще, если автор код покажет, может и получится вырулить.
21 апр 19, 01:24    [21868015]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3543
Kazantsev Alexey
после D2009

начиная с...
21 апр 19, 01:26    [21868016]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
rgreat
Member

Откуда:
Сообщений: 5070
Kazantsev Alexey,

Кодовую страницу можно и явно указать.
21 апр 19, 01:26    [21868017]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
rgreat
Member

Откуда:
Сообщений: 5070
А вообще у меня есть рабочий код в XE3 работающий с DLL из 2007.

Именно потому что компонент для юникода не был адаптирован я сделал к нему обертку в виде DLL.
21 апр 19, 01:29    [21868019]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3543
rgreat
Кодовую страницу можно и явно указать.

Да дело не в этом, дело в дополнительных полях в заголовке строки. Если там, вдруг, строка освобождается в приложении то будет AV.
21 апр 19, 01:31    [21868020]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
rgreat
Member

Откуда:
Сообщений: 5070
Kazantsev Alexey,

Я таких нюансов уже и не помню. Но в любом случае в D2007 и ранее строка по сути это простой массив байт с длиной по смещению -4.

Если мне память не изменяет.
21 апр 19, 01:33    [21868021]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
x1ca4064
Member

Откуда:
Сообщений: 979
Ural2
shonli95
string в d7 это ansistring когда в xe+ это уже utf16 следовательно ты понял

Пока нет. Все еще пытаюсь найти способ преобразования. Или, как говорит Dimitry Sibiryakov, дело - труба?



Покажите определения функций, которые передают строки (или записи/классы с ними). BorlandMM (ShareMem) используется?
21 апр 19, 01:33    [21868022]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
x1ca4064
Member

Откуда:
Сообщений: 979
rgreat
Kazantsev Alexey,

Я таких нюансов уже и не помню. Но в любом случае в D2007 и ранее строка по сути это простой массив байт с длиной по смещению -4.

Если мне память не изменяет.


И refCount по смещению -8
21 апр 19, 01:35    [21868023]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3543
rgreat
Но в любом случае в D2007 и ранее строка по сути это простой массив байт с длиной по смещению -4.

Всё так, только при освобождении/ресайзе строки будет вычисляться адрес блока памяти с учётом всех полей заголовка. dll сформирует строку без дополнительных полей, понятное дело, а приложение будет считать, что поля есть и адрес вычислит неправильно. В общем, код смотреть нужно.
21 апр 19, 01:37    [21868025]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
L1G
Member

Откуда:
Сообщений: 102
Ural2, если надоест экспериментировать - тупо сделайте в 2007 прокладочную dll с конвертацией строк в pansichar
21 апр 19, 01:39    [21868026]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
rgreat
Member

Откуда:
Сообщений: 5070
Kazantsev Alexey,

На крайняк можно в D7-2007 сделать еще одну обертку где переобернуть функции в PChar или еще что в этом духе.
21 апр 19, 01:39    [21868027]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
rgreat
Member

Откуда:
Сообщений: 5070
О, два костыля - пара!
21 апр 19, 01:40    [21868029]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3543
rgreat
На крайняк можно в D7-2007 сделать еще одну обертку где переобернуть функции в PChar или еще что в этом духе.

Если там строки передаются в составе массивов/объектов/записей, то разрулить можно будет и без прокладок.
21 апр 19, 01:41    [21868030]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
Ural2
Member

Откуда:
Сообщений: 58
Получаю из dll 2007 массив из указателей на DataSets. Спотыкаюсь на первой строке - не могу прочитать наименование DataSet ( латиница). До разбора данных в DataSet дело не доходит.
Вот код:

type
CyrillicString = type AnsiString(1251);

var
a_ds : array [0..99] of pointer; // массив указателей на DataSets, который дает dll 2007


procedure LoadData(ds_num: integer);
var
ds: TDataset;
ds_name: String;
A: AnsiString;
U: UnicodeString;
C: CyrillicString;
Src: TEncoding;
Dst: TEncoding;
begin

ds:=A_ds[0];

// реально наименование первого Dataset = Around (латиныца)

// попытка 1 получить наименование - кракозябры
ds_name:=ds.Name;
cxMemo1.Lines.Add('String = '+ds_name);

// попытка 2 получить наименование - ???
A:=TDataset(A_ds[i]).Name;
cxMemo1.Lines.Add('AnsiString = '+A);

// попытка 3 получить наименование - кракозябры
U:=TDataset(A_ds[i]).Name;
cxMemo1.Lines.Add('UnicodeString = '+U);


// попытка 4 получить наименование - ???
C:=TDataset(A_ds[i]).Name;
cxMemo1.Lines.Add('CyrillicString = '+C);


// попытка 5 получить наименование (в Dst подставляла разные кодовые страницы) - ???
Src := TEncoding.GetEncoding(1251);
Dst := TEncoding.GetEncoding(65001);
ds_name := Dst.GetString(TEncoding.Convert(Src, Dst, Src.GetBytes(TDataset(A_ds[i]).Name)));
cxMemo1.Lines.Add('TEncoding = '+ds_name);

end;



Вариант с промежуточной dll-2 на 2007 работает:
- загрузка данных из dll-1
- выгрузка данных DataSets в файлы
- загрузка файлов в программе на XE
Но желательно более простую технологию без многочисленных файловых операций (цепочка работает круглосуточно раз в 30 сек).
21 апр 19, 09:22    [21868064]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
Ural2
Member

Откуда:
Сообщений: 58
В приложенном коде не обращайте внимания на не объявленную i (i=ds_num) - это я пыталась убрать лишнее из кода
21 апр 19, 09:36    [21868066]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3543
Ural2
ds_name:=ds.Name;

Сделай так:
ds_name := UnicodeString(AnsiString(Pointer(ds.Name)));

Но вообще, не факт, что поля объектов в разных версиях имеют одинаковое смещение (у поля FName - одинаковое), поэтому даже если со строками ситуация разрешится это ещё не гарантия успешности такого подхода.
21 апр 19, 10:56    [21868095]     Ответить | Цитировать Сообщить модератору
 Re: Как в delhhi XE3 считать строку из dll, написанной на delphi 2007  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3543
Kazantsev Alexey
Сделай так

Нет, так работать не будет. Нужно вручную перекодировать.
21 апр 19, 11:20    [21868107]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить