Contributor: SWAG SUPPORT TEAM

{
  This code is provided as is, without guarrantees or support of any kind. 
  We have two programs, one of which launches another, and passes
  shared data to it. You can place anything in that shared data,
  including instructions on when to launch a third or fourth program. 
  The shared data could be of virtually any size, the record we
  chose here was picked more or less at random.
}
{$M 1024, 0, 0}
{$R+,S+}
program Home;
Uses
  Dos,
  SharInfo;

Const
  SD: TData =
    (S: 'Hi, this message came from Home.Exe.';
    I: 42);

var
  AddrStr: String[11];
  Temp: String[5];

  procedure HandleInput;
  var
    vSeg, vOfs, Code: Word;
    PData: ^TData;
  begin
    Val(ParamStr(1), vSeg, Code);
    Val(ParamStr(2), vOfs, Code);
    PData := Ptr(vSeg, vOfs);
    WriteLn('Home hears: ', PData^.S);
    WriteLn('The magic number is: ', PData^.I);
  end;

begin
  FillChar(AddrStr[1], 11, #32);
  Str(Seg(SD), AddrStr);
  Str(Ofs(SD), Temp);
  Move(Temp[1], AddrStr[length(AddrStr) + 2], length(Temp));
  Inc(AddrStr[0], succ(length(temp)));
  WriteLn('===============');
  WriteLn('Execing Visitor');
  WriteLn('===============');
  Swapvectors;
  Exec('Visitor.Exe', AddrStr);
  Swapvectors;
  WriteLn('==========================');
  WriteLn('We have returned to home. ');
  WriteLn('==========================');
  WriteLn;
  WriteLn('Home Says: ', SD.S);
  WriteLn('Here''s a number visitor gave us: ', SD.I);
end.

{======================}
{$M 2024, 0, 2000}
{$S+,R+}
program Visitor;
Uses
  Dos,
  SharInfo;

var
  vSeg, vOfs, Code: Word;
  PData: ^TData;

  procedure ReportError;
  begin
    WriteLn('This program is a subprogram of Home');
    Halt(1);
  end;

  procedure SendDataBack;
  var
    AddrStr: String[11];
    Temp: String[5];
    SD: TData;
  begin
    SD.S := 'Hi, this message came from Visitor.Exe.';
    SD.I := 42;
    FillChar(AddrStr[1], 11, #32);
    Str(Seg(SD), AddrStr);
    Str(Ofs(SD), Temp);
    Move(Temp[1], AddrStr[length(AddrStr) + 2], length(Temp));
    Inc(AddrStr[0], succ(length(temp)));
    Exec('Home.Exe', AddrStr);
  end;

begin
  if ParamCount <> 2 then ReportError;
  Val(ParamStr(1), vSeg, Code);
  if Code <> 0 then ReportError;
  Val(ParamStr(2), vOfs, Code);
  if Code <> 0 then ReportError;
  PData := Ptr(vSeg, vOfs);
  WriteLn;
  WriteLn('Visitor hears: ', PData^.S);
  WriteLn;
  PData^.S := 'This is a message from visitor. ';
  PData^.i := 231;
  {SendDataBack;}
end.

{======================}

Unit SharInfo;
{
  Here 's the data being shared between the two programs. 
  I've declared a record with a string and an integer, but
  it wouldn't matter what the contents of this record 
  happened to be. The fields could be of virtually any type
  and could contain any type of data.
}
Interface
Type
  TData = Record
    S: String;
    I: Integer;
  end;
Implementation
end.