К Т П           План занятия                                                              1                                           Страницы  | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 |

3. Программа процесса с новой консолью

Листинг 4.2. Программа процесса, который создает процесс с новой консолью

#include <windows.h>
#include <conio.h>

int main()
{
char lpszAppName[] = "C:\\ConsoleProcess.exe";

STARTUPINFO si;
PROCESS_INFORMATION piApp;

ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);

// создаем новый консольный процесс
if (!CreateProcess(lpszAppName, NULL, NULL, NULL, FALSE,
CREATE_NEW_CONSOLE, NULL, NULL, &si, &piApp))
{
_cputs("The new process is not created.\n");
_cputs("Check a name of the process.\n");
_cputs("Press any key to finish.\n");
_getch();
return 0;
}

_cputs("The new process is created.\n");
// ждем завершения созданного процесса
WaitForSingleObject(piApp.hProcess, INFINITE);
// закрываем дескрипторы этого процесса в текущем процессе
CloseHandle(piApp.hThread);
CloseHandle(piApp.hProcess);

return 0;
}

Отметим в этой программе два момента. Во-первых, перед запуском консольного процесса ConsoleProcess.exe все поля структуры si типа startupinfo должны заполняться нулями. Это делается при помощи вызова функции zeroMemory, которая предназначена для этой цели и имеет следующий прототип:
VOID ZeroMemory(
  PVOID Destination, II адрес блока памяти
  SIZE_T Length II длина блока памяти
) ;

В этом случае вид главного окна запускаемого приложения определяется по умолчанию самой операционной системой Windows. Во-вторых, в параметре dwCreationFiags устанавливается флаг create_new_console. Это говорит системе о том, что для запускаемого процесса должна быть создана новая консоль. Если этот параметр будет равен null, то новая консоль для запускаемого процесса не создается и весь консольный вывод нового процесса будет направляться в консоль родительского процесса.

Структура piApp типа process_information содержит идентификаторы и дескрипторы нового создаваемого процесса и его главного потока. Мы не используем эти дескрипторы в нашей программе и поэтому закрываем их. Значение false параметра binheritHandle говорит о том, что эти дескрипторы не являются наследуемыми.
Теперь запустим наш новый консольный процесс другим способом, используя второй параметр функции CreateProcess. Это можно сделать при помощи программы, приведенной в листинге 4.3.

 


Предыдущая        В начало страницы       Следующая
3