Работа в DLL со строками

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
fpbt
новенький
Сообщения: 17
Зарегистрирован: 27.09.2011 21:48:35

Работа в DLL со строками

Сообщение fpbt »

Здравствуйте, возник у меня вот такой вопрос: "Почему нельзя использовать обработку строк (из EXE) в DLL в следующем варианте в FPC через PString с дальнейшей возможностью использования синтаксиса со строками?"

Код: Выделить всё

library DLLProject;

{$mode objfpc}{$H+}

uses
  DLLUnit1
  { you can add units after this };

{$R *.res}

begin
end.

//==============================

unit DLLUnit1;

{$mode objfpc}{$H+}

interface

procedure test2(sSomeStr: PString); stdcall;


implementation

 procedure test2(sSomeStr: PString); stdcall;
 begin

  {В вызывающем приложении возникает ERROR "External: SIGSEGV"}
  (sSomeStr^)[1] := 's';
  (sSomeStr^)[3] := 'd';

 end;

 exports test2;

end.


Хотя, если заменить

Код: Выделить всё

...
  (sSomeStr^)[1] := 's';
  (sSomeStr^)[3] := 'd';
...
на

Код: Выделить всё

...
  (PChar(sSomeStr^) + 0)^ := 's';
  (PChar(sSomeStr^) + 2)^ := 'd';
...
, то ошибка не возникает.

Написал вот тут http://bugs.freepascal.org/view.php?id=20353, ответили что это не баг.

Кстати, этот код вполне нормально работает в Delphi.
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

Есть неоднозначность с типом String и следовательно PString. Переменной типа PString может быть присвоен адрес как переменной типа ShortString, так и AnsiString, а принципы работы с ними разные. Если очень необходимо передавать в процедуру именно строку, то тип параметра лучше задать явно (PAnsiString или PShortString) и следить за типом фактически передаваемого параметра.
fpbt
новенький
Сообщения: 17
Зарегистрирован: 27.09.2011 21:48:35

Сообщение fpbt »

Понял, спасибо.

Тогда ещё один вопрос, разве компилятор не должен ориентироваться на настройки? Если явно в настройках указывается, что используй AnsiString (например, директивой {$H+} или в опциях), то разве компилятор не должен трактовать неоднозначные типы в соответствии с директивой? Т.е. PString считать как PAnsiString и для него генерировать код.
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Передавать паскалевские строки в dll - плохая идея, безопаснее - PChar.
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

Массив типа byte ещё надёжнее и не зависит от директив компилятора и диалектов паскаля. Только придётся добавить в DLL функцию для конвертации массивов в строки.
Ответить