|
|
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Был проект: программа на delhhi 2007 + dll на delhhi 2007. Программу перевели на delhhi XE3, dll перевести нельзя (сторонний разработчик). dll в головную программу передает данные, в том числе типа string. Получаю строки в виде крокозябр . Перечитала кучу документации по приведению типов и кодировок, сотни попыток - все безрезультатно... Помогите, люди добрые! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2019, 21:54 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
string в d7 это ansistring когда в xe+ это уже utf16 следовательно ты понял ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2019, 21:59 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Ural2dll в головную программу передает данные, в том числе типа string. Точно String, а не PAnsiChar? Если да, тогда лучше сразу забудь о переходе на ХЕ3. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2019, 22:05 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, а какие проблемы могут быть с pansichar ? Это же всего лишь массив байт, который кончается на #0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2019, 22:37 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
shonli95string в d7 это ansistring когда в xe+ это уже utf16 следовательно ты понял Пока нет. Все еще пытаюсь найти способ преобразования. Или, как говорит Dimitry Sibiryakov, дело - труба? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2019, 22:50 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
shonli95а какие проблемы могут быть с pansichar ? Вот с ним-то как раз проблем быть не должно. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 00:08 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Ural2Пока нет. Все еще пытаюсь найти способ преобразования. Как это нет? Всё логично pchar=pAnsiChar string=AnsiString Это не способ преобразования, это способ получения строки определённого формата. Я не думаю, что там используется string по причине того, что библиотеку можно сразу выбросить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 00:26 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovЕсли да, тогда лучше сразу забудь о переходе на ХЕ3. Что мешает сменить String на AnsiString? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 01:19 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
rgreatЧто мешает сменить String на AnsiString? Coe Page Aware после D2009 мешает. А вообще, если автор код покажет, может и получится вырулить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 01:24 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexeyпосле D2009 начиная с... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 01:26 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, Кодовую страницу можно и явно указать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 01:26 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
А вообще у меня есть рабочий код в XE3 работающий с DLL из 2007. Именно потому что компонент для юникода не был адаптирован я сделал к нему обертку в виде DLL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 01:29 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
rgreatКодовую страницу можно и явно указать. Да дело не в этом, дело в дополнительных полях в заголовке строки. Если там, вдруг, строка освобождается в приложении то будет AV. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 01:31 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, Я таких нюансов уже и не помню. Но в любом случае в D2007 и ранее строка по сути это простой массив байт с длиной по смещению -4. Если мне память не изменяет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 01:33 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Ural2shonli95string в d7 это ansistring когда в xe+ это уже utf16 следовательно ты понял Пока нет. Все еще пытаюсь найти способ преобразования. Или, как говорит Dimitry Sibiryakov, дело - труба? Покажите определения функций, которые передают строки (или записи/классы с ними). BorlandMM (ShareMem) используется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 01:33 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
rgreatKazantsev Alexey, Я таких нюансов уже и не помню. Но в любом случае в D2007 и ранее строка по сути это простой массив байт с длиной по смещению -4. Если мне память не изменяет. И refCount по смещению -8 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 01:35 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
rgreatНо в любом случае в D2007 и ранее строка по сути это простой массив байт с длиной по смещению -4. Всё так, только при освобождении/ресайзе строки будет вычисляться адрес блока памяти с учётом всех полей заголовка. dll сформирует строку без дополнительных полей, понятное дело, а приложение будет считать, что поля есть и адрес вычислит неправильно. В общем, код смотреть нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 01:37 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Ural2, если надоест экспериментировать - тупо сделайте в 2007 прокладочную dll с конвертацией строк в pansichar ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 01:39 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, На крайняк можно в D7-2007 сделать еще одну обертку где переобернуть функции в PChar или еще что в этом духе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 01:39 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
О, два костыля - пара! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 01:40 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
rgreatНа крайняк можно в D7-2007 сделать еще одну обертку где переобернуть функции в PChar или еще что в этом духе. Если там строки передаются в составе массивов/объектов/записей, то разрулить можно будет и без прокладок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 01:41 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Получаю из 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.04.2019, 09:22 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
В приложенном коде не обращайте внимания на не объявленную i (i=ds_num) - это я пыталась убрать лишнее из кода ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 09:36 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Ural2 ds_name:=ds.Name; Сделай так: Код: pascal 1. Но вообще, не факт, что поля объектов в разных версиях имеют одинаковое смещение (у поля FName - одинаковое), поэтому даже если со строками ситуация разрешится это ещё не гарантия успешности такого подхода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 10:56 |
|
||
|
|

start [/forum/topic.php?fid=58&tid=2039547]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
166ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
78ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 497ms |

| 0 / 0 |
