Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Обучение VC++ / ЛекцииИнтернетС++ / Лекция_лаб_практикум.doc
Скачиваний:
64
Добавлен:
16.02.2016
Размер:
932.35 Кб
Скачать

Пример 10. Создание процесса вWindows.

Показывает создание процесса и наследование хендла. Модуль "Project1", приведённый ниже, запускается с параметром в командной строке, задающим имя создаваемого файла. Создаётся файл, в него записывается фраза " Это было ". Затем формируется командная строка, содержащая имя нового процесса "Project2" и наследуемый хендл файла, и запускается процесс, который дописывает в тот же файл слово "наследование".

Project1.cpp

#include <vcl.h>

#pragma hdrstop

#include <stdio.h>

#include <process.h>

#pragma argsused

int main( int argc, char* argv[] )

{

DWORD dwWriten;

char st[9], st1[30];

PROCESS_INFORMATION piProcInfo;

STARTUPINFO siStartInfo;

HANDLE hY; //Хендл файла

SECURITY_ATTRIBUTES saY; // Атрибуты файла

if (argc!=2)

exit(1);

saY.nLength=sizeof(SECURITY_ATTRIBUTES); //Задание

saY.lpSecurityDescriptor=NULL; //атрибутов

saY.bInheritHandle=true; //наследуется хендл

//Создание файла

hY=CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ |

FILE_SHARE_WRITE, &saY, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

printf("Parent PID %d\n Inherited HANDLE of File %d\n",getpid(),hY);

WriteFile(hY,"Это было ",9,&dwWriten,NULL); //Записать в файл строку

ZeroMemory(&siStartInfo, sizeof(STARTUPINFO)); //подготовка

siStartInfo.cb = sizeof(STARTUPINFO); // STARTUPINFO для нового процесса

// Формирование командной строки нового процесса

itoa((int)hY,st,10);

strcpy(st1,"project2.exe ");

strcat(st1,st);

// Создание нового процесса

CreateProcess(NULL,

st1, // командная строка

NULL, // атрибуты SECURITY_PROCESS

NULL, // атрибуты безопасности первичной нити

TRUE, // разрешить наследование хендлов

CREATE_NEW_CONSOLE, // флаги

NULL, // использование родительского окружения

NULL, // использование родительского каталога

&siStartInfo, // STARTUPINFO

&piProcInfo); // PROCESS_INFORMATION

printf("Press any key to continue\n");

getchar();

exit(0);

}

Project2.cpp

#include <vcl.h>

#pragma hdrstop

#include <vcl.h>

#include <stdio.h>

#include <process.h>

#pragma argsused

int main( int argc, char* argv[] )

{

HANDLE hY;

DWORD dWriten;

if (argc!=2)

exit(1);

hY=(HANDLE)(unsigned int)atoi(argv[1]); //Получение наследуемого хендла

printf("Child PID %d\n Inherited HANDLE of File %d\n",getpid(),hY);

if(WriteFile(hY, "наследие", 8, &dWriten, NULL) = = true) //Дописать в файл

{ printf("Write comlete\n");}

else

printf("Write missing\n");

printf("Press any key to continue\n");

getchar();

return 0;

}

Пример 11. Использование неименованного канала.

Программа передаёт и считывает из канала строку символов "hello".

#include <vcl.h>

#pragma hdrstop

#pragma argsused

#include <stdio.h>

int main(int argc, char* argv[])

{

char str[5];

bool tt;

HANDLE hRead,hWrite;

DWORD dwWriten;

tt=CreatePipe(

&hRead,

&hWrite,

NULL, // указатель на SECURITY_ATTRIBUTES

0 // Число байт в канале по умолчанию

);

WriteFile(hWrite,"Hello",5,&dwWriten,NULL);

ReadFile(hRead,str,5,&dwWriten,NULL);

printf("Pipe declared %s",str);

getchar();

return 0;

}