Показать сообщение отдельно
  #22  
Старый 01.11.2012, 18:10
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Без тупых ухищрений типа засовывания переменной в аргумент функции НЕЛЬЗЯ!
Что можно. Например так.

Раз
Код:
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 работать не будут.

Ну как-то так
Ответить с цитированием