DLL библиотеки, строки, {$H+}
 Добавлено: 12.03.2013 20:45:38
Добавлено: 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 выясняется, что строки успешно изменяются, процедура также успешно изменяет обе строки на правильные значения, а ошибка возникает при последующей попытке присвоить строками новые значения, будто бы вызванная процедура заблокировала их изменение.
Только начал разбираться с библиотеками (буквально сегодня), многого не знаю. Вышеописанное поведение - это ошибка в компиляторе или я что-то неправильно делаю? Если ошибка, то как о ней сообщить (или исправить ее?).
 )
 )