DLL библиотеки, строки, {$H+}
Добавлено: 12.03.2013 20:45:38
Помогите школьнику разобраться с ошибкой.
Краткое содержание: при вызове из библиотеки (.dll) внешней процедуры с разносортными параметрами (var string и [const || по значению] - произвольного типа) при включенной директиве компилятора {$H+} после обработки строки процедурой дальнейшее редактирование строки блокируется, и возникает ошибка времени выполнения.
Подробности:
Код библиотеки:
Код программы:
При запуске Project2 возникает ошибка:
77268DC9 ff4014 incl 0x14(%eax)
(ассемблер)
Количество string в параметрах произвольно (1, 2...).
Если убрать параметр i (integer), программа работает правильно.
Если вместо i добавить параметр любого другого типа (главное - передача по значению или через const) - ошибка.
Если убрать директиву компилятора {$H+} (длинные строки??) из обоих файлов - все будет работать нормально (ошибки не будет ни в каком случае).
При пошаговом выполнении программы с наблюдением за переменными S1 и S2 выясняется, что строки успешно изменяются, процедура также успешно изменяет обе строки на правильные значения, а ошибка возникает при последующей попытке присвоить строками новые значения, будто бы вызванная процедура заблокировала их изменение.
Только начал разбираться с библиотеками (буквально сегодня), многого не знаю. Вышеописанное поведение - это ошибка в компиляторе или я что-то неправильно делаю? Если ошибка, то как о ней сообщить (или исправить ее?).
Краткое содержание: при вызове из библиотеки (.dll) внешней процедуры с разносортными параметрами (var string и [const || по значению] - произвольного типа) при включенной директиве компилятора {$H+} после обработки строки процедурой дальнейшее редактирование строки блокируется, и возникает ошибка времени выполнения.
Подробности:
Код библиотеки:
- Код: Выделить всё
library project1;
{$mode objfpc}{$H+}
uses
SysUtils;
procedure Proc1(var S1, S2: string; i: Integer);
begin
S1 := 'very good thing' + IntToStr(i);
S2 := 'myyy' + IntToStr(i*2);
end;
exports
Proc1;
begin
end.
Код программы:
- Код: Выделить всё
program project2;
{$mode objfpc}{$H+}
procedure Proc1(var SA, SB: string; i: Integer); external 'project1.dll';
var
S1, S2: string;
begin
S1 := 'something';
S2 := 'somebody';
Proc1(S1, S2, 5);
S1 := 'some body';
S2 := 'kill';
end.
При запуске Project2 возникает ошибка:
77268DC9 ff4014 incl 0x14(%eax)
(ассемблер)
Количество string в параметрах произвольно (1, 2...).
Если убрать параметр i (integer), программа работает правильно.
Если вместо i добавить параметр любого другого типа (главное - передача по значению или через const) - ошибка.
Если убрать директиву компилятора {$H+} (длинные строки??) из обоих файлов - все будет работать нормально (ошибки не будет ни в каком случае).
При пошаговом выполнении программы с наблюдением за переменными S1 и S2 выясняется, что строки успешно изменяются, процедура также успешно изменяет обе строки на правильные значения, а ошибка возникает при последующей попытке присвоить строками новые значения, будто бы вызванная процедура заблокировала их изменение.
Только начал разбираться с библиотеками (буквально сегодня), многого не знаю. Вышеописанное поведение - это ошибка в компиляторе или я что-то неправильно делаю? Если ошибка, то как о ней сообщить (или исправить ее?).