Запуск дочерних процессов. Простейшие способы взаимодействия (обмена данными), страница 3

а также три дополнительных флага STARTF_FORCEONFEEDBACK, STARTF_FORCEOFFFEEDBACK и STARTF_SCREENSAVER.

1.4. Дочерний процесс

Создайте еще одно приложение.

Обеспечьте запуск данного приложения как дочернего процесса.

Подсказка: при этом нужно сформировать путь к исполняемому файлу дочернего процесса =>

в CreateProcess() можно указать путь (лучше относительный)

1.5. Взаимодействие родительского и дочернего процессов посредством перенаправления стандартного ввода/вывода

Задача: в родительском процессе создать объект – файл и передать дочернему процессу этот файл для записи в качестве стандартного потока вывода. В дочернем процессе сформировать текст и записать этот текст в поток вывода – при этом на самом деле запись будет осуществляться в открытый в родительском процессе файл)

Для этого:

1)  в родительском процессе открыть файл (объект должен быть наследуемым дочерним процессом!!!). Для этого а) создать и проинициализировать структуру SECURITY_ATTRIBUTES (объект должен быть наследуемым!) б) создать файл с помощью CreateFile

2)  Создать и проинициализировать структуру STARTUPINFO (Замечание: порождаемому процессу перенаправляем стандартный вывод в открытый в родительском процессе файл): а) si.dwFlags = STARTF_USESTDHANDLES; б) si.hStdOutput =hFile;

3)  при создании дочернего процесса «унаследовать» все наследуемые объекты.

4)  можно (необязательно) «подождать» окончания дочернего процесса

5)  закрыть все открытые дескрипторы

Подсказка:

HANDLE CreateFile(

LPCTSTR     lpFileName, //указатель на строку с именем файла (при необходимости с путем)

DWORD dwAccess,   //нужный Вам режим доступа: если файл будет открыт только для чтения – GENERIC_READ, только запись - GENERIC_WRITE а если и запись, и чтение - GENERIC_READ | GENERIC_WRITE. 0-содержимое файла нельзя считывать или записывать. Применяется, если Вы хотите всего лишь получить атрибуты файла

DWORD dwShareMode,      //режим совместного использования файла (как могут другие этот файл использовать): 0 – совместный доступ запрещен, то есть файл не подлежит открытию «со стороны» (любой другой CreateFile для этого файла завершится INVALID_HANDLE_VALUE), более того – даже этот же процесс не сможет «открыть» данный файл еще раз FILE_SHARE_READ – попытка другим процессом открыть файл с GENERIC_WRITE не удастся (защита на время чтения), то есть другие процессы могут открывать данный файл только для чтения FILE_SHARE_WRITE– попытка другим процессом открыть файл с GENERIC_READ не удастся (защита на время записи), но разрешается параллельная запись в файл FILE_SHARE_READ | FILE_SHARE_WRITE – другой процесс может открывать файл без ограничений.

LPSECURITY_ATTRIBUTES lpSecurityAttributes,    // указатель на структуру SECURITY_ATTRIBUTES или 0 (дескриптор не будет наследуемым + защита по умолчанию)

DWORD dwCreation, //параметры создания – определяет: надо ли создавать новый файл, заменять существующий… Следующие флаги можно объединять «|» CREATE_NEW – завершится неудачей, если указанный файл уже существует, иначе создается новый файл CREATE_ALWAYS – существующий файл заменяется новым OPEN_EXISTING – неудача, если файл не существует OPEN_ALWAYS – файл открывается и создается, если не существует TRUNCATE_EXISTING – устанавливается нулевая длина файла, при этом в dwAccess должен быть по крайней мере GENERIC_WRITE

DWORD dwFlagsAndAttributes,   //Обычно FILE_ATTRIBUTE_NORMAL Замечание: атрибуты - это характеристики самого файла, а не способа его открытия, => имеют смысл только при создании файла => они игнорируются, если открывается существующий файл: FILE_ATTRIBUTE_NORMAL – используется только если не установлены никакие другие атрибуты (однако флаги могут быть установлены) флаги: FILE_ATTRIBUTE_READONLY – нельзя ни писать в файл, ни удалять его FILE_FLAG_DELETE_ON_CLOSE – полезен для временных файлов. Файл удаляется, когда закрывается его последний открытый дескриптор FILE_FLAG_OVERLAPPED – важен для асинхронного ввода/вывода