Без
тупых ухищрений типа засовывания переменной в аргумент функции НЕЛЬЗЯ!
Что можно. Например так.
Раз
Код:
unit UMyParams;
interface
type
TMyParams = record (* здесь описываем все переменные,
которые хотим видеть и там и там *)
Int1 :Integer;
Int2 :Integer;
end;
PMyParams = ^TMyParams;
var
MyParams : PMyParams;
implementation
end.
В DLL
Код:
Library MyDLL;
uses UMyParams;
procedure SetMyParams(Params:PMyParams); stdcall;
begin
MyParams := Params;
end;
procedure Work; stdcall;// любая другая процедура
begin
writeln(ft,' Int1='+inttostr(MyParams.Int1));
writeln(ft,' Int2='+inttostr(MyParams.Int2));
end;
export SetMyParams;
export Work;
end.
В Exe
Код:
project MyExe;
uses UMyParams;
procedure SetMyParams(Params:PMyParams); stdcall; extern 'MyDLL.dll';
procedure Work;stdcall; extern 'MyDLL.dll';
begin
new(MyParams);// создаём структуру с параметрами
MyParams.Int1:=10;
MyParams.Int2:=20;
SetMyParams(MyParams);// передаём её адрес в DLL
Work; // проверяем, что получилось
MyParams.Int1:=30;
MyParams.Int2:=40;
Work; // проверяем, что получилось
end.
Ежели в структуре будут строки - необходимо подключать Sharemem или fastsharemem. Если там будут объектные типы, то стоит иметь ввиду, что операторы
is и
as работать не будут.
Ну как-то так