powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
43 сообщений из 43, показаны все 2 страниц
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804318
Ural2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Был проект: программа на delhhi 2007 + dll на delhhi 2007. Программу перевели на delhhi XE3, dll перевести нельзя (сторонний разработчик).
dll в головную программу передает данные, в том числе типа string. Получаю строки в виде крокозябр
.
Перечитала кучу документации по приведению типов и кодировок, сотни попыток - все безрезультатно...
Помогите, люди добрые!
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804319
shonli95
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
string в d7 это ansistring когда в xe+ это уже utf16 следовательно ты понял
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804321
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ural2dll в головную программу передает данные, в том числе типа string.

Точно String, а не PAnsiChar? Если да, тогда лучше сразу забудь о переходе на ХЕ3.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804327
shonli95
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

а какие проблемы могут быть с pansichar ? Это же всего лишь массив байт, который кончается на #0
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804329
Ural2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
shonli95string в d7 это ansistring когда в xe+ это уже utf16 следовательно ты понял
Пока нет. Все еще пытаюсь найти способ преобразования. Или, как говорит Dimitry Sibiryakov, дело - труба?
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804348
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shonli95а какие проблемы могут быть с pansichar ?

Вот с ним-то как раз проблем быть не должно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804358
shonli95
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ural2Пока нет. Все еще пытаюсь найти способ преобразования.

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

pchar=pAnsiChar
string=AnsiString

Это не способ преобразования, это способ получения строки определённого формата. Я не думаю, что там используется string по причине того, что библиотеку можно сразу выбросить
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804369
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЕсли да, тогда лучше сразу забудь о переходе на ХЕ3.
Что мешает сменить String на AnsiString?
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804372
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatЧто мешает сменить String на AnsiString?
Coe Page Aware после D2009 мешает. А вообще, если автор код покажет, может и получится вырулить.
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804373
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeyпосле D2009
начиная с...
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804374
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Кодовую страницу можно и явно указать.
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804376
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще у меня есть рабочий код в XE3 работающий с DLL из 2007.

Именно потому что компонент для юникода не был адаптирован я сделал к нему обертку в виде DLL.
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804377
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatКодовую страницу можно и явно указать.
Да дело не в этом, дело в дополнительных полях в заголовке строки. Если там, вдруг, строка освобождается в приложении то будет AV.
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804378
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

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

Если мне память не изменяет.
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804379
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ural2shonli95string в d7 это ansistring когда в xe+ это уже utf16 следовательно ты понял
Пока нет. Все еще пытаюсь найти способ преобразования. Или, как говорит Dimitry Sibiryakov, дело - труба?


Покажите определения функций, которые передают строки (или записи/классы с ними). BorlandMM (ShareMem) используется?
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804380
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatKazantsev Alexey,

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

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

И refCount по смещению -8
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804382
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatНо в любом случае в D2007 и ранее строка по сути это простой массив байт с длиной по смещению -4.
Всё так, только при освобождении/ресайзе строки будет вычисляться адрес блока памяти с учётом всех полей заголовка. dll сформирует строку без дополнительных полей, понятное дело, а приложение будет считать, что поля есть и адрес вычислит неправильно. В общем, код смотреть нужно.
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804383
L1G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ural2, если надоест экспериментировать - тупо сделайте в 2007 прокладочную dll с конвертацией строк в pansichar
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804384
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

На крайняк можно в D7-2007 сделать еще одну обертку где переобернуть функции в PChar или еще что в этом духе.
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804386
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О, два костыля - пара!
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804387
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatНа крайняк можно в D7-2007 сделать еще одну обертку где переобернуть функции в PChar или еще что в этом духе.
Если там строки передаются в составе массивов/объектов/записей, то разрулить можно будет и без прокладок.
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804406
Ural2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Получаю из 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 сек).
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804408
Ural2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В приложенном коде не обращайте внимания на не объявленную i (i=ds_num) - это я пыталась убрать лишнее из кода
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804419
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ural2 ds_name:=ds.Name;
Сделай так:
Код: pascal
1.
ds_name := UnicodeString(AnsiString(Pointer(ds.Name)));


Но вообще, не факт, что поля объектов в разных версиях имеют одинаковое смещение (у поля FName - одинаковое), поэтому даже если со строками ситуация разрешится это ещё не гарантия успешности такого подхода.
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804428
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyСделай так
Нет, так работать не будет. Нужно вручную перекодировать.
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804429
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ural2,
Используй widestring!
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804435
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ural2,

Дико грязный хак:
Код: pascal
1.
ds_name := TEncoding.Default.GetString(TBytes(Pointer(ds.Name)));



Более цивилизованный способ:
Код: 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.
type

 TEncodingHelper = Class Helper For TEncoding

  Function GetString(ABytes : PByte; ACount : Integer) : String;

 End;

{ TEncodingHelper }

Function TEncodingHelper.GetString(ABytes : PByte; ACount : Integer) : String;
Var

 Count : Integer;

Begin

 Result := '';

 If Assigned(ABytes) Then
  Begin

   Count := GetCharCount(ABytes, ACount);

   SetLength(Result, Count);
   GetChars(ABytes, ACount, Pointer(Result), Count);

  End;

End;

...

ds_name := TEncoding.Default.GetString(Pointer(ds.Name), Length(ds.Name));
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804439
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ural2Получаю из dll 2007 массив из указателей на DataSets

Обломись без вариантов. Передача объектов между рантаймами разных версий невозможна.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804441
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovОбломись без вариантов. Передача объектов между рантаймами разных версий невозможна.
Не то что бы невозможна. Возможно, но это будут объекты несовместимые с новыми.
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804444
Ural2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Kazantsev Alexey]Ural2,

Дико грязный хак:
Код: pascal
1.
ds_name := TEncoding.Default.GetString(TBytes(Pointer(ds.Name)));



Это сработало! Попробую теперь данные из DS прочитать.
Спасибо!
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804445
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ural2Это сработало!

Ага, привет, утечки памяти, её порча уже не за горами.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804451
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovАга, привет, утечки памяти
Конкретном в этом месте утечек не будет.
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804454
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyКонкретном в этом месте утечек не будет.

ds версии 2007 возвращает Name как AnsiString со счётчиком ссылок равным 2. RTL XE3
обращается с полученным указателем как с UnicodeString без счётчика ссылок и освобождает
занимаемую ею память после использования. Я не хотел бы отлаживать эту кашу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804456
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovds версии 2007 возвращает Name как AnsiString со счётчиком ссылок равным 2. RTL XE3
обращается с полученным указателем как с UnicodeString без счётчика ссылок и освобождает
занимаемую ею память после использования
Ты код посмотри, там нет прямого копирования строк (Name - свойство без геттера).
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804463
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyТы код посмотри, там нет прямого копирования строк (Name - свойство без геттера).

Именно поэтому оно возвращает непосредственно указатель FName, увеличивая его счётчик ссылок.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804468
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovИменно поэтому оно возвращает непосредственно указатель FName, увеличивая его счётчик ссылок.
Ничего оно не увелчивает. Счетчик увеличивается при копировании. Здесь копирования нет, делается чтение по адресу.
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804477
Ural2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreatDimitry SibiryakovОбломись без вариантов. Передача объектов между рантаймами разных версий невозможна.
Не то что бы невозможна. Возможно, но это будут объекты несовместимые с новыми.
Да, DataSet-ы я получила, но делать с ними ничего не могу...
Код: pascal
1.
2.
3.
4.
5.
6.
    TableView1.BeginUpdate();
    TableView1.ClearItems;
    DataSource1.DataSet:=TDataSet(A_ds[i]);   // здесь Access Violation
    TableView1.DataController.DataSource:=DataSource1;
    TableView1.DataController.CreateAllItems;
    TableView1.EndUpdate;


Неужели сдаваться?..
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804478
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ural2,

Прокладочку писать...
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804499
shonli95
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function AnsiStringToPAnsiChar(Str: AnsiString): PAnsiChar;
begin
  Result := PAnsiChar(Str);
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  Test: AnsiString;
  ToValue: PAnsiChar;
begin
  Test := 'Ansi Test String';
  ToValue := AnsiStringToPAnsiChar(Test);
  ShowMessage(ToValue);
end;




Код: pascal
1.
2.
3.
4.
 Result := PAnsiChar(Str);
 mov eax,[ebp-$04]
 call @LStrToPChar
 mov [ebp-$08],eax
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804593
L1G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ural2, т.к. у вас уже есть решение через файлы - просто переделайте их на memory mapped (mmf)
http://delphikingdom.com/asp/viewitem.asp?catalogid=513
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39804728
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как все запущено... возврат VCL объектов из DLL... только "прокладка", иначе загадочных глюков не оберешься. Причем вылезать будут в самых неожиданных моментах.
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39805033
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyПрокладочку писать...Не взлетит. Ты код видел?Ural2
Код: pascal
1.
DataSource1.DataSet:=TDataSet(A_ds[i]);

Если бы работа шла только с DataSet можно было бы проложить интерфейс. А она хочет его подключить к DataSource и, как я понимаю, еще и отобразить на каком-то DBControl.

Т.е. это в прокладке нужно экспортировать какой-нибудь интерфейс IDataSet, а потом в основной программе писать своего наследника TDataSet, который бы поднимал данные из этого интерфейса. Удовольствие еще то
...
Рейтинг: 0 / 0
Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
    #39805038
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

У ТС уже есть работающая прокладка , просто нужно переделать выгрузку в файлы на выгрузку в память.
...
Рейтинг: 0 / 0
43 сообщений из 43, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как в delhhi XE3 считать строку из dll, написанной на delphi 2007
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]