#include <windows.h>
#include <stdio.h>

struct SharedData  // Разделяемая структура данных
{
  char fig; // Фигура, y-координату которой надо изменить (значения: a, b, c, d)
  char sign; // Показывает, увеличить или уменьшить y-координату фигуры (значения: +, -)
  int stop; // = 1, если была команда выхода из программы
};

int main (int argc, char *argv[])
{
  SetEnvironmentVariable ("WINDOWSIZE", argv[1]); // передадим программe p1 размер окна
  SECURITY_ATTRIBUTES SA;                     
  SA.nLength = sizeof SA, SA.lpSecurityDescriptor = 0, // установим атрибуты безопасности
  SA.bInheritHandle = TRUE;
  // создаем объект для отображения файла
  HANDLE hMap = CreateFileMapping ((HANDLE)-1, &SA, PAGE_READWRITE, 0,
    sizeof(SharedData), 0);
  char str [40];
  // установим переменную окружения для передачи в p1 описателя объекта
  sprintf (str, "%d", hMap), SetEnvironmentVariable ("hMap", str);
  // настроим указатели, которые нужны для создания нового процесса - графического окна
  STARTUPINFO SI;
  ZeroMemory (&SI, sizeof SI), SI.cb = sizeof SI;
  PROCESS_INFORMATION PI;
  CreateProcess ("p1.exe", 0, 0, 0, TRUE, 0, 0, 0, &SI, &PI); // создаем новый процесс
  // строим отображение объекта
  SharedData *p = (SharedData*) MapViewOfFile (hMap, FILE_MAP_WRITE,
    0, 0, sizeof(SharedData));

  p->fig = ' '; // начальные значения разделяемых переменных
  p->sign = ' ';
  p->stop = 0;
  char s[80];
  while (1)
  {
    printf("Command: ");
    scanf("%s", s); // ждем команду пользователя
    if (!strcmp(s, "q")) // если пришла команда выхода из программы
      break;
    /* Команды изменения направления движения для указанной фигуры. 
       Надо ввести название фигуры (a, b, c, d) */
    else if (!strcmp(s, "a+") || !strcmp(s, "a-") ||
      !strcmp(s, "b+") || !strcmp(s, "b-") ||
      !strcmp(s, "c+") || !strcmp(s, "c-") ||
      !strcmp(s, "d+") || !strcmp(s, "d-")) {
      p->fig = s[0];
      p->sign = s[1];
    }
    else
      printf("Bad command!\n");
  }
  p->stop = 1;
  UnmapViewOfFile (p); // освобождаем все ресурсы
  CloseHandle (hMap);
  return 0;
}
