После отката на fpc2.0.0 и Lazarus 0.9.12 вариант с ExGetStr:=@GetStr заработал нормально

.
Но теперь я зашол в полный тупик

.
Стринги нельзя передавать из dll в ехе или что там в линуксе. переменная типа string - динамический массив, должен убиваться или изменяться в томже модуле где создан.
Ну хорошо поставлю я string[256]; не в этом дело.
Чето ты какието сложности наводишь на пустом месте скажи конкретно что ты хочешь получить?
Я хотел чтоб библеотека, когда ей понадобится, вызываля функцию в программе с запросом нужной строки.
Примерно...
- Код: Выделить всё
library test;
type PGetStr = function (indx: integer): string;
var GetStr: PGetStr; export;
procedure test; cdecl;
var i: integer;
begin
for i:= 1 to 22 do writeln(GetStr(i));
end;
exports test;
end.
//-------------------------------
program testing;
uses Classes;
interface
type
PGetStr = function (indx: integer): string;
var
ExGetStr: PGetStr; external name 'GetStr';
FileWithStrings: TStringList;
implementation
function GetStr(indx: integer): string;
begin
result:=FileWithString.Strings[indx];
end;
begin
FileWithStrings:=TStringLisr.Create;
FileWithStrings.LoadFromFile('testing.pas');
ExGetStr:=@GetStr;
test;
FileWithStrings.Free;
end.
Всё так хорошо было, а теперь оказалось что вызываемая библеотекой функция GetStr в программе выполняется в контексте библеотеки и о FileWithStrings обьекте ничего не знает

. После долгих раздумий (~2часа) и поиска в гугле (~3 часа) я понял что если неполучится менять контекст на программный при вызове, то придётся переробатывать много строчек кода в библеотеке и менять логику многих функций <_< , а это очень плохо.
PS Вот-так меня кинул этот fp <_<
PSS Кстати откапал какойто термин - "callback", он может отнасится к моей проблеме?