0 / 0 / 1
Регистрация: 16.08.2018
Сообщений: 9

Перекодировать текст из Delphi5 в Delphi10

16.08.2018, 15:51. Показов 3505. Ответов 19

Студворк — интернет-сервис помощи студентам
Добрый день

Существует проблема

проект написанный на delphi5 должен использовать dll, реализованную на delphi10.
в dll из проекта передаётся некоторое количество переменных типа string, необходимых для работы dll

Проблема заключается в том, что стандартные методы перекодировки не помогают(например, сохранение в поток с tencoding.coding)

Подскажите варианты решения. Ибо на данный момент - это полный тупик.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.08.2018, 15:51
Ответы с готовыми решениями:

Перекодировать текст в UTF-8
Подскажите как можно перевести введённій в ТЕдит текст в кодировку UTF-8?

Код на delphi10 работает не так, как в delphi 7
Здравствуйте. Подскажите, пожалуйста, как сделать так, чтобы код работал верно при компиляции delphi10. В делфи 7 работает нормально. Код...

Перекодировать текст с UTF-8 в ASCII
...

19
Модератор
 Аватар для D1973
9902 / 6440 / 2454
Регистрация: 21.01.2014
Сообщений: 27,341
Записей в блоге: 3
16.08.2018, 16:01
Лучший ответ Сообщение было отмечено E_Punk как решение

Решение

Цитата Сообщение от E_Punk Посмотреть сообщение
передаётся некоторое количество переменных типа string
Хм-м, думал, со времен Д5 что-то изменилось - но нет...
E_Punk, вот этот здоровенный комментарий при создании DLL - он вообще для кого написан?
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
В двух словах: DLL не должна ни получать в качестве параметров ни отдавать как результат функции тип String. Ну или делать то, что там, в комментарии написано...
1
0 / 0 / 1
Регистрация: 16.08.2018
Сообщений: 9
16.08.2018, 16:18  [ТС]
Я всё-всё понимаю , НО система(проект в d5) уже реализована таким образом, и мне не могут передать ничего другого, кроме string,
кроме того в этой системе успешный опыт использования других dll написанных на d5 - и конкретно под мою ничего меняться не будет

если варианты перекодирования отсутствуют, то видимо придётся переписать на d5 или d7
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,608
16.08.2018, 16:42
А dll переписать можно?
0
0 / 0 / 1
Регистрация: 16.08.2018
Сообщений: 9
16.08.2018, 18:58  [ТС]
мою - без проблем.

Добавлено через 19 минут
просто не очень, конечно, хотелось переписывать в d5/7...
свою dll я делала на подобие тех, что написаны на d5
и до сообщения уважаемого d1973 пребывала в уверенности, что дело в несоответствии кодировок
(пыталась widestring-->unicode по всякому) - бессмысленно, безуспешно, беспощадно =(
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
16.08.2018, 22:46
а может AnsiString? там символы однобайтные.

а если проанализировать поступающие данные и понять в какую сторону копать?
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,608
17.08.2018, 01:02
Цитата Сообщение от E_Punk Посмотреть сообщение
мою - без проблем.
Так и перепишите её на Д10 просто заменив тип string в dll на тип AnsiString. И тогда у программы на Д5 возможно не будет никаких проблем с приемом/передачей строк из dll.
0
0 / 0 / 1
Регистрация: 16.08.2018
Сообщений: 9
17.08.2018, 08:54  [ТС]
Проверяла, там в однобайтовая кодировка, просто привести к ansistring ничего не дало.

Добавлено через 4 минуты
Проблема не в программе на д5, она вполне себе отличненько мне все передаёт,проблема внутри моей длл, не читается то что прога передала, (но до шага вернуть ещё не дошли,но если все останется на д10,то возвращать буду Анси)
Похоже реально все дело в парадигме длл, то есть максимум что в неё можно отправить это шорт или чар...

Добавлено через 18 минут
Моей длл на д10 позрез надо хотя бы два параметра обработать, переданные в виде стрингов из д5.
при подключении длл к аттач то процесс,выяснилось что передаваемое д5 - полнейшие кракозябры, я мудрила и потоками, и просто переводами, и из доса пыталась перекодировать, но ничего. Все что удалось выяснить передаваемое - однобайтавая кодировка

Добавлено через 19 минут
Просто переопределить как Анси не получится, класс,определённый с такими полями(стрингами, используется в 10 длл, но написанных га д5
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,608
18.08.2018, 01:17
Цитата Сообщение от E_Punk Посмотреть сообщение
Просто переопределить как Анси не получится
Почему не получится? dll вы точно сами писали или переделывали что-то надыбанное?
0
0 / 0 / 1
Регистрация: 16.08.2018
Сообщений: 9
18.08.2018, 11:40  [ТС]
Ну,что имеется в виду
Входным переменным сделать ansitoutf8, ?
Не помогает

Добавлено через 12 минут
В длл создаётся класс с определёнными полями,этот класс используется в 10е других длл(но написанных на 5), потом в длл даётся описание методов этого класса(частности распарсивание xml) где и нужно делать сравнение со стрингами,но они отображаются в виде "?".

Объясните, пожалуйста ,тогда конкретнее что Вы имеете в виду?


Потому что,вчера передела на д5, и теперь вылезла обратная ситуация я не могу из юникодa xml вернуть результат в нормальной кодировке,это опять иероглифы(как вариант: xml переходить в Анси или вайдстринг до того как парсить его)

Помогите, скажите хоть что-нибудь. Не исключено,что я чего-то не знаю/не понимаю, ибо абсурдность ситуации на лицо.

Добавлено через 3 минуты
Ну, или сделать потомка класса,где ПОЛНОСТЬЮ ПЕРЕОПРЕДЕЛИТЬ все поля и методы?.

Добавлено через 5 секунд
Ну, или сделать потомка класса,где ПОЛНОСТЬЮ ПЕРЕОПРЕДЕЛИТЬ все поля и методы?.
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
18.08.2018, 16:52
Для того чтобы решить проблему нужна ясность происходящего.. а именно, пакет входных данных и пакет выходных данных, а не каша из слов пытающихся объяснить что-то про Д5 и Д10... использовать надо эквивалетные типы данных это во первых для начала.. да и слово "кодировка" меня тут смушает почему-то..
Цитата Сообщение от E_Punk Посмотреть сообщение
Похоже реально все дело в парадигме длл, то есть максимум что в неё можно отправить это шорт или чар...
дак уж опредись. чар или шорт или вообще стринг.... а может массив байт??? что было бы логичнее)
0
0 / 0 / 1
Регистрация: 16.08.2018
Сообщений: 9
19.08.2018, 10:28  [ТС]
Если не использовать слово кодировка- в чем тогда проблема?

Мне передают string,до вызова функций из моей dll в д5 - это нормальная читабельная строка
,после захода в dll эта же строка становится вопросами(если я ей делаю ansitoutf8),иероглифами,если вообще ничего не делаю.
Из попыток решить проблему: Пытались подключить sharemem ,и насколько я знаю ,мне пытались передать shortstring(на счёт этого я не уверена - проект на д5 ,я в глаза не видела. ).-это то ,что делалось со стороны проекта, я со своей стороны уперлась в то, что простейшие способы не помогают,сохранение в memorystream c encoding - то же не помогло.
Кроме того что мне передают переменную в однобайтовом представлении,я ничего не могу понять.

Скажите ,тогда в чем проблема.

Добавлено через 18 минут
Проблема как минимум в том ,что стринг в Дельфи 5 это не Та стринг,что в Дельфи 10,потому что в Дельфи 10 стринг=юникодстринг.
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
19.08.2018, 14:00
ну вот тупой пример
dll Пишу на XE10.2.3

Delphi
1
2
3
4
5
6
7
8
function GetAnsiString(AStr: String): String; stdcall;
begin
  Result := 'Hello, ' + AStr + #13#10 +
            'Привет, ' + AStr;
end;
 
exports
  GetAnsiString;
гружу дальше функцию тоже в XE10.2.3


гружу тоже самое в старой дельфи, 2006, где String еще не юникоднутая


уже проблема выскочила...

далее

меняем тип в DLL на AnsiString

Delphi
1
2
3
4
5
6
7
8
function GetAnsiString(AStr: AnsiString): AnsiString; stdcall;
begin
  Result := 'Hello, ' + AStr + #13#10 +
            'Привет, ' + AStr;
end;
 
exports
  GetAnsiString;
дело обстоит в ХЕ10.2.3


а вот как теперь обстоит дело в 2006


дальше поиграться с типами и увидеть, в чем же именно проблема там...
1
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
19.08.2018, 14:06
а вообще, не надо String посылать.. указатель надо посылать и будет счастье всегда)))
0
Модератор
 Аватар для D1973
9902 / 6440 / 2454
Регистрация: 21.01.2014
Сообщений: 27,341
Записей в блоге: 3
19.08.2018, 17:18
Лучший ответ Сообщение было отмечено E_Punk как решение

Решение

Цитата Сообщение от Arcor Посмотреть сообщение
а вообще, не надо String посылать.. указатель надо посылать и будет счастье всегда
Именно!!!
0
0 / 0 / 1
Регистрация: 16.08.2018
Сообщений: 9
20.08.2018, 09:18  [ТС]
Лучший ответ Сообщение было отмечено northener как решение

Решение

Спасибо всем
Мой последний шанс угас с конкретным примером.

Я видимо ужасно изъясняюсь, но как-бы я пыталась сказать что в моей длл реализуются методы, объявление которых реализовано string'ами и используется в живом проекте в живых д5 длльках...
Тк результат длл - фактически материальный, то программист, который заведует этим проектом не очень хочет там что-то менять.


Еще раз спасибо.
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
20.08.2018, 15:45
Цитата Сообщение от E_Punk Посмотреть сообщение
проект написанный на delphi5 должен использовать dll, реализованную на delphi10.
ты пишешь DLL на д10? а использование сей идет на д5? я это так понимаю... д10 это которая д2006?? или которая хе10?

ну так и сделай сразу нормульную архитектуру библиотеки, где выкинутся все стринги! Или я не понимаю написанного))))

Не по теме:

ну.. 14 лет житьбы за границей, возможно дают о себе знать =-O



Цитата Сообщение от E_Punk Посмотреть сообщение
Из попыток решить проблему: Пытались подключить sharemem ,и насколько я знаю ,мне пытались передать shortstring
ну так как ты администратор протокола обмена данных, ТЫ пишешь правила обмена данных между программами, и все ИСпользователи твоего продукта обязаны подчиняться правилам, которые ТЫ создаешь. Иначе коммуникация не работает, даже на уровне логики)

объясни по пунктам:
- что дано
- что искомо

не в предложениях
0
0 / 0 / 1
Регистрация: 16.08.2018
Сообщений: 9
20.08.2018, 16:37  [ТС]
под дельфи 10 я как-бы понимала версию рад студии сеатл(метка в названии темы), конечно, если быть точным, то это Version 23.0.22248.5795

Добавлено через 17 минут
значит дано

Delphi
1
2
3
4
5
unit Class 
constructor Class(n1,n2,n3...n8:STRING)
destructor
function import(filename,date:STRING):boolean; virtual; abstract;
function export:boolean; virtual; abstract;
Этот unit Class написан в дельфи5(именно том,которое было до дельфи6, дельфи7) и используется в КУЧЕ(от 10 и больше) dll написанных на дельфи5 для Глобального проекта,который тоже реализован в дельфи5.

Моей задачей было написать очередную длл со своей реализацией методов(в этом конкретном случае нужно было распарсить xml), с учетом того, что проект на д5 умеет брать только стринглист определенного формата(с этим походу тоже возникают траблы), при чем настояли, чтоб в радстудии все было.

локально
я unit Class - переделала, и оно заработало(вместо string пообъявляла shortstring - как D1973 советовал)

сейчас - походу единственное решение для этого КОНКРЕТНОГО случая придется делать свой особый Class и в д5 программисту допиливать кусок...

Добавлено через 6 минут
я уж пыталась в д5 все переделать,(удачно оказалось - даже парсер доступен в нем),
но xml на юникоде выдает свои кракозябры, а функция utf8toansi(которой по ФАКТУ не оказалось в д5, но которая УДАЧНО была в модуле парсера) - не сработала....

Добавлено через 5 минут
хотелось бы конечно, такое решение, которое бы позволяло использовать unit Class, в том виде в каком он существует сейчас и в д5, чтоб не доделывать...

но видимо - увы. (мне кажется реально все дело в парадигме длл

Цитата Сообщение от D1973 Посмотреть сообщение
Хм-м, думал, со времен Д5 что-то изменилось - но нет...
E_Punk, вот этот здоровенный комментарий при создании DLL - он вообще для кого написан?
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
В двух словах: DLL не должна ни получать в качестве параметров ни отдавать как результат функции тип String. Ну или делать то, что там, в комментарии написано...
)
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
21.08.2018, 21:17
я еще раз прочитал тему, думал может что прояснится спустя пару дней.. но вот снова наткнулся на сие писание
Цитата Сообщение от E_Punk Посмотреть сообщение
Я всё-всё понимаю , НО система(проект в d5) уже реализована таким образом, и мне не могут передать ничего другого, кроме string,
и задался вопросом, а это как? кто-то написал хост приложение, а только теперь надо написать, что программа должна использовать. Очень странная реализация программы, обычно наоборот делают. пишут инструментарий, а уж затем используют его в программе, а тут наоборот.. бррр

Цитата Сообщение от E_Punk Посмотреть сообщение
constructor Class(n1,n2,n3...n8:STRING)
ну и параметром бы уж массив или список передавать.
Переделывайте архитектуру пока не поздно))

я тут один проект пишу уже 4 года.. ну так.. между делом, и мне самому не ясна была суть того, что я в итоге хочу получить) в итоге я раз 30 уже начинал проект с нуля писать))) делает конечно мало удовольствия, но зато с каждым разом обрастает новым функционалом и подтачивается все четче к расширяемости)

а у вас там какой-то парсинг XML)) и вы боитесь переделать программу, чтобы уж сразу было хорошо. Ну ваше дело)
0
0 / 0 / 1
Регистрация: 16.08.2018
Сообщений: 9
22.08.2018, 09:20  [ТС]
Да,уже приняли ответственное решение все в shortstring переделать и char. Уже хорошо.
Будем улучшать, тем более руководство за попытки перетащить огромездный проект во что-то более свежее ,чем дельфи5.

Спасибо большое,учту замечания)


PS в основном проблема была в том,что я с другого проекта,где я чуть больше понимаю,чем здесь и я далеко не главный программист в обоих
Этих проектах.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.08.2018, 09:20
Помогаю со студенческими работами здесь

Перекодировать из 16-бит в обычный текст
Python до этого я не разу не видел. Дали задание, я начал читать книгу, но пока только нашел как читать и записывать txt. Конвертить строку...

Перекодировать текст с UTF-8 в ASCII
Даже не знаю с чего начать Задача такова: Есть файл в формате UTF8. Нужно его перекодировать в ASCII и сохранить.

Как перекодировать Subject в нормальный текст?
Кто-нибудь знает, как перекодировать сообщение (*.eml), в частности 'Subject: =?koi8-r?B?4cHiwvfX58c=?=' в нормальный текст 'АаБбВвГг'? ...

А можно ли в VB текст из KOI8R перекодировать "на лету"?
Скачиваю текст со страницы vtData=Inet1.GetChunk(1024, icString) На выходе он весь в KOI8R А мне нужно в windows /dos кодировке ...

IE: текст из base64 в 1251 как перекодировать?
На странице IE получаю от веб-сервиса base64-текст (потому что передается русскоязычный xml). Собственно Вопрос: Как средствами...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru