Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Преобразование PCHAR в STRING в Delphi XE 64bit / 24 сообщений из 24, страница 1 из 1
19.11.2019, 17:15
    #39891231
Sergey_rb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
Добрый день!

Есть функция в DLL, которую вызывает Oracle.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function test_string(pStr: pchar): pchar; cdecl;
var
  F1: TextFile;
  s: string;
begin

       assignfile(F1, ExtractFileDir(ParamStr(0)) + '\Test4.log');
       Rewrite(F1);
       WriteLn(F1,pStr);
       CloseFile(F1);

  Result:=pstr;

end;



Функция пишет входящее значение в лог и возвращает его обратно в Oracle.
С возвращаемым значением все в порядке, а в лог пишутся знаки вопроса, т.е. неявное преобразование в string работает не корректно.

Как правильно преобразовать PCHAR в STRING?

Oracle 11g 64bit
Delphi XE4
DLL скомпилирована 64 bit
...
Рейтинг: 0 / 0
19.11.2019, 17:29
    #39891244
asviridenkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
Sergey_rb,

Для начала выяснить, pwidechar там передается или pansichar
...
Рейтинг: 0 / 0
19.11.2019, 17:36
    #39891252
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
Sergey_rbКак правильно преобразовать PCHAR в STRING?

Для начала надо выяснить а действительно ли Оракул даёт тебе PChar, а не PAnsiChar или
PUtf8Char. Потом надо вкуривать управление памятью, чтобы быть уверенным, что ты
возвращаешь указатель на валидный буфер, а не на мусор в уже освобождённой памяти.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.11.2019, 17:39
    #39891255
Sergey_rb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
В Oracle

Код: pascal
1.
2.
NLS_CHARACTERSET = CL8MSWIN1251
NLS_NCHAR_CHARACTERSET=AL16UTF16



Если это поможет
...
Рейтинг: 0 / 0
19.11.2019, 17:41
    #39891256
Sergey_rb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
Dimitry Sibiryakov

Sergey_rbКак правильно преобразовать PCHAR в STRING?

Для начала надо выяснить а действительно ли Оракул даёт тебе PChar, а не PAnsiChar или
PUtf8Char. Потом надо вкуривать управление памятью, чтобы быть уверенным, что ты
возвращаешь указатель на валидный буфер, а не на мусор в уже освобождённой памяти.


В Oracle возвращается тоже самое значение, что и уходит от него.

Код: pascal
1.
Result:=pstr;
...
Рейтинг: 0 / 0
19.11.2019, 17:46
    #39891262
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
Sergey_rb,

Вы там ^ нигде не потеряли?
...
Рейтинг: 0 / 0
19.11.2019, 18:02
    #39891275
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
Sergey_rbЕсли это поможет

Не поможет. Это кодировка хранения (причём неизвестно выполняется ли этот контракт, ибо
Оракул не контролирует данные). Она может быть сто раз преобразована в любую форму пока
дойдёт до твоей функции. Так что не ленись, читай документацию, ставь эксперименты,
разбирайся.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.11.2019, 18:21
    #39891289
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
Запиши строку как бинарный буфер через filestream и смотри, в каком виде она приходит
...
Рейтинг: 0 / 0
19.11.2019, 18:44
    #39891299
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function test_string(pStr: pchar): pchar; cdecl;
var
  Strm: TStream;;
begin
  Strm := TFileStream.Create(ParamStr(0)) + '\Test4.log', fmCreate);
  try
    Strm.Write(pStr^, 6);
  finally
    Strm.Free;
  end;
  Result:=pstr;
end;

Теперь передайте строку из 6 символов (только латиницу и только кириллицу) и посмотрите, что будет в файлах
...
Рейтинг: 0 / 0
20.11.2019, 09:30
    #39891453
Sergey_rb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
Код: pascal
1.
2.
3.
4.
5.
6.
7.
  FileName:= ExtractFileDir(ParamStr(0)) + '\Test4.log';
  Strm := TFileStream.Create(FileName, fmCreate);
  try
    Strm.Write(pStr^, length(pStr)*2);
  finally
    Strm.Free;
  end;




При запуске из тестовой программы:
Передаю латинницу
qwerty
в файле
qwerty

Передаю кириллицу
йцукен
в файле
9FC:5=


При запуске из Oracle
передаю
qwerty
в файле
睱牥祴⸀㜹㔮0l2

передаю
йцукен
в файле
⸀㜹㔮0l2

передаю
123456
в файле
㈱㐳㘵⸀㜹㔮0l2
...
Рейтинг: 0 / 0
20.11.2019, 10:01
    #39891468
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
Очень хорошо. А теперь открой получившийся файл в hex режиме.
...
Рейтинг: 0 / 0
20.11.2019, 10:25
    #39891482
b0rk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
Sergey_rb
В Oracle

Код: pascal
1.
2.
NLS_CHARACTERSET = CL8MSWIN1251
NLS_NCHAR_CHARACTERSET=AL16UTF16



Если это поможет

у клиента Oracle может быть кодировка отличная от этих кодировок
...
Рейтинг: 0 / 0
20.11.2019, 12:07
    #39891539
Sergey_rb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
Василий 2
Очень хорошо. А теперь открой получившийся файл в hex режиме.


Странная ситуация - при первом вызове текста qwerty, в файл пишется qwerty,
При повторном запуске функции, пишутся китайские иероглифы.

Если переоткрыть отладчик, при этом DLL закрывается и заново открывается, то опять все нормально.
...
Рейтинг: 0 / 0
20.11.2019, 13:55
    #39891649
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
Открывая файл как текст, ты в любом случае его перекодируешь. Поэтому сложно понять, что там было изначально. Hex режим.
...
Рейтинг: 0 / 0
20.11.2019, 14:08
    #39891659
Sergey_rb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
Запускаю с параметром qwerty, в файле тоже qwerty
коды
71,77,65,72,74,79
...
Рейтинг: 0 / 0
20.11.2019, 14:14
    #39891669
Sergey_rb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
Параметр
йцукен

в файле коды
E9,F6,F3,EA,E5,ED
...
Рейтинг: 0 / 0
20.11.2019, 14:29
    #39891682
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
Sergey_rbПараметр
йцукен

в файле коды
E9,F6,F3,EA,E5,ED

А теперь идёшь на https://ru.wikipedia.org/wiki/Windows-1251 и воочию убеждаешься, что да,
это оно, а вовсе не utf-16 который ты ожидаешь в своей функции.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.11.2019, 14:42
    #39891699
Sergey_rb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
Теперь я окончательно запутался - мне надо на стороне Оракла менять кодировку или в DLL?
...
Рейтинг: 0 / 0
20.11.2019, 14:52
    #39891713
asviridenkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
Sergey_rb,

В функции использовать pansichar, но еще откуда-то нужно получить кодировку, либо принудительно использовать Win1251
...
Рейтинг: 0 / 0
20.11.2019, 14:54
    #39891717
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
Sergey_rbТеперь я окончательно запутался - мне надо на стороне Оракла менять кодировку или в DLL?

Использовать мозг и документацию я тебе уже предлагал, но, видимо, не судьба.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.11.2019, 15:36
    #39891768
Sergey_rb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
Dimitry Sibiryakov

Sergey_rbТеперь я окончательно запутался - мне надо на стороне Оракла менять кодировку или в DLL?

Использовать мозг и документацию я тебе уже предлагал, но, видимо, не судьба.


Был бы мозг - не работал бы программистом...
...
Рейтинг: 0 / 0
20.11.2019, 16:15
    #39891811
Sergey_rb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
Поставил PAnsiChar
Вроде работает...
...
Рейтинг: 0 / 0
20.11.2019, 16:15
    #39891814
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
Sergey_rb
Теперь я окончательно запутался - мне надо на стороне Оракла менять кодировку или в DLL?

Теперь ты знаешь, что Оракл в твою DLL передает Win1251. Что уж с этим делать - второй вопрос, зависит от того, что ты хочешь достичь.
...
Рейтинг: 0 / 0
20.11.2019, 16:46
    #39891843
Sergey_rb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование PCHAR в STRING в Delphi XE 64bit
Василий 2
Sergey_rb
Теперь я окончательно запутался - мне надо на стороне Оракла менять кодировку или в DLL?

Что уж с этим делать - второй вопрос, зависит от того, что ты хочешь достичь.


Отложу до понедельника...
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Преобразование PCHAR в STRING в Delphi XE 64bit / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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