|
|
|
Как в 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 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyСделай так Нет, так работать не будет. Нужно вручную перекодировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 11:20 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Ural2, Используй widestring! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 11:33 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Ural2, Дико грязный хак: Код: pascal 1. Более цивилизованный способ: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 11:55 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Ural2Получаю из dll 2007 массив из указателей на DataSets Обломись без вариантов. Передача объектов между рантаймами разных версий невозможна. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 12:26 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovОбломись без вариантов. Передача объектов между рантаймами разных версий невозможна. Не то что бы невозможна. Возможно, но это будут объекты несовместимые с новыми. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 12:35 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
[quot Kazantsev Alexey]Ural2, Дико грязный хак: Код: pascal 1. Это сработало! Попробую теперь данные из DS прочитать. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 12:52 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Ural2Это сработало! Ага, привет, утечки памяти, её порча уже не за горами. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 12:53 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovАга, привет, утечки памяти Конкретном в этом месте утечек не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 13:16 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyКонкретном в этом месте утечек не будет. ds версии 2007 возвращает Name как AnsiString со счётчиком ссылок равным 2. RTL XE3 обращается с полученным указателем как с UnicodeString без счётчика ссылок и освобождает занимаемую ею память после использования. Я не хотел бы отлаживать эту кашу. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 13:32 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovds версии 2007 возвращает Name как AnsiString со счётчиком ссылок равным 2. RTL XE3 обращается с полученным указателем как с UnicodeString без счётчика ссылок и освобождает занимаемую ею память после использования Ты код посмотри, там нет прямого копирования строк (Name - свойство без геттера). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 13:37 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyТы код посмотри, там нет прямого копирования строк (Name - свойство без геттера). Именно поэтому оно возвращает непосредственно указатель FName, увеличивая его счётчик ссылок. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 13:53 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovИменно поэтому оно возвращает непосредственно указатель FName, увеличивая его счётчик ссылок. Ничего оно не увелчивает. Счетчик увеличивается при копировании. Здесь копирования нет, делается чтение по адресу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 14:03 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
rgreatDimitry SibiryakovОбломись без вариантов. Передача объектов между рантаймами разных версий невозможна. Не то что бы невозможна. Возможно, но это будут объекты несовместимые с новыми. Да, DataSet-ы я получила, но делать с ними ничего не могу... Код: pascal 1. 2. 3. 4. 5. 6. Неужели сдаваться?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 14:24 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Ural2, Прокладочку писать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 14:30 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Код: pascal 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2019, 15:40 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Ural2, т.к. у вас уже есть решение через файлы - просто переделайте их на memory mapped (mmf) http://delphikingdom.com/asp/viewitem.asp?catalogid=513 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2019, 01:31 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Как все запущено... возврат VCL объектов из DLL... только "прокладка", иначе загадочных глюков не оберешься. Причем вылезать будут в самых неожиданных моментах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2019, 10:55 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyПрокладочку писать...Не взлетит. Ты код видел?Ural2 Код: pascal 1. Если бы работа шла только с DataSet можно было бы проложить интерфейс. А она хочет его подключить к DataSource и, как я понимаю, еще и отобразить на каком-то DBControl. Т.е. это в прокладке нужно экспортировать какой-нибудь интерфейс IDataSet, а потом в основной программе писать своего наследника TDataSet, который бы поднимал данные из этого интерфейса. Удовольствие еще то ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2019, 17:50 |
|
||
|
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, У ТС уже есть работающая прокладка , просто нужно переделать выгрузку в файлы на выгрузку в память. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2019, 18:02 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2039547]: |
0ms |
get settings: |
6ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
141ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
98ms |
get tp. blocked users: |
2ms |
| others: | 195ms |
| total: | 485ms |

| 0 / 0 |
