Преобразование PCHAR в STRING в Delphi XE 64bit

Sergey_rb
Дата: 19.11.2019 17:15:56
Добрый день!

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

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
asviridenkov
Дата: 19.11.2019 17:29:31
Sergey_rb,

Для начала выяснить, pwidechar там передается или pansichar
Dimitry Sibiryakov
Дата: 19.11.2019 17:36:11

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

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

Posted via ActualForum NNTP Server 1.5

Sergey_rb
Дата: 19.11.2019 17:39:19
В Oracle

NLS_CHARACTERSET = CL8MSWIN1251
NLS_NCHAR_CHARACTERSET=AL16UTF16


Если это поможет
Sergey_rb
Дата: 19.11.2019 17:41:15
Dimitry Sibiryakov

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

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


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

Result:=pstr;
DarkMaster
Дата: 19.11.2019 17:46:00
Sergey_rb,

Вы там ^ нигде не потеряли?
Dimitry Sibiryakov
Дата: 19.11.2019 18:02:31

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

Не поможет. Это кодировка хранения (причём неизвестно выполняется ли этот контракт, ибо
Оракул не контролирует данные). Она может быть сто раз преобразована в любую форму пока
дойдёт до твоей функции. Так что не ленись, читай документацию, ставь эксперименты,
разбирайся.

Posted via ActualForum NNTP Server 1.5

Василий 2
Дата: 19.11.2019 18:21:11
Запиши строку как бинарный буфер через filestream и смотри, в каком виде она приходит
_Vasilisk_
Дата: 19.11.2019 18:44:24
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 символов (только латиницу и только кириллицу) и посмотрите, что будет в файлах
Sergey_rb
Дата: 20.11.2019 09:30:45
  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