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

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

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

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

Сообщение fpbt » 27.09.2011 22:04:30

Здравствуйте, возник у меня вот такой вопрос: "Почему нельзя использовать обработку строк (из 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.
fpbt
новенький
 
Сообщения: 17
Зарегистрирован: 27.09.2011 21:48:35

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

Сообщение SAK » 28.09.2011 00:26:55

Есть неоднозначность с типом String и следовательно PString. Переменной типа PString может быть присвоен адрес как переменной типа ShortString, так и AnsiString, а принципы работы с ними разные. Если очень необходимо передавать в процедуру именно строку, то тип параметра лучше задать явно (PAnsiString или PShortString) и следить за типом фактически передаваемого параметра.
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

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

Сообщение fpbt » 28.09.2011 21:53:35

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

Тогда ещё один вопрос, разве компилятор не должен ориентироваться на настройки? Если явно в настройках указывается, что используй AnsiString (например, директивой {$H+} или в опциях), то разве компилятор не должен трактовать неоднозначные типы в соответствии с директивой? Т.е. PString считать как PAnsiString и для него генерировать код.
fpbt
новенький
 
Сообщения: 17
Зарегистрирован: 27.09.2011 21:48:35

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

Сообщение v-t-l » 29.09.2011 08:41:16

Передавать паскалевские строки в dll - плохая идея, безопаснее - PChar.
v-t-l
энтузиаст
 
Сообщения: 740
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

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

Сообщение Сквозняк » 29.09.2011 21:31:13

Массив типа byte ещё надёжнее и не зависит от директив компилятора и диалектов паскаля. Только придётся добавить в DLL функцию для конвертации массивов в строки.
Сквозняк
энтузиаст
 
Сообщения: 1126
Зарегистрирован: 29.06.2006 22:08:32


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru
cron