Параметр pvEnvironment
Параметр pvEnvironment указывает на блок памяти, хранящий строки переменных окружения, которыми будет пользоваться новый процесс. Обычно вместо этого па раметра передается NULL, в результате чего дочерний процесс наследует строки пе рсмснных окружения от родительского процесса. В качестве альтернативы можно вызвать функцию GetEnvironmentStrings
Параметр pszCurDir
Он позволяет родительскому процессу установить текущие диск и каталог для дочер него процесса. Если его значение — NULL, рабочий каталог нового процесса будет тем же, что и у приложения, его породившего. А если он отличен от NULL, то должен ука зывать на строку (с нулевым символом в конце), содержащую нужный диск и каталог. Заметьте, что в путь надо включать и букву диска.
Параметр psiStartlnfo
Этот параметр указывает на структуру STARTUPINFO:
typedef struct _STARTUPINFO { DWORD cb; PSTH lpReserved; PSTR lpDesktop; PSTR lpTitle; DWORD dwX; DWORD dwY;
DWORD dwXSize; DWORD dwYSize; DWORD dwXCountChars; DWORD dwYCountChars; DWORD dwFillAttribute; DWORD dwFlags; WORD wShowWindOw; WORD cbReserved2; PBYTE lpReserved2; HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError; } STARTUPINFO, *LPSTARTUPINFO;
Элементы структуры STARTUPINFO используются Windows-функциями при созда нии нового процесса. Надо сказать, что большинство приложений порождает процес сы с атрибутами по умолчанию Но и в этом случае Вы должны инициализировать все элементы структуры STARTUPINFO хотя бы нулевыми значениями, а в элемент сb — заносить размер этой структуры:
STARTUPINFO si = { sizeof(si) }; CreateProcess(.. , &si, ...};
Параметр ppiProclnfo
Параметр ppiProcInfo указывает на структуру PROCESS_INFORMATION, которую Вы должны предварительно создать; ее элементы инициализируются самой функцией CreateProcess. Структура представляет собой следующее
typedef struct _PROCESS_INFORMATION { HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThreadId; } PROCESS_TNFORMATION;
1.2 Завершение процесса.
Процесс можно завершить четырьмя способами:
входная функция первичного потока возвращает управление (рекомендуемый способ),
один из потоков процесса вызывает функцию ExitProcess (нежелательный способ) - VOID ExilProcess(UINT fuExitCode);
поток другого процесса вызывает функцию TerminateProcess (тоже нежелательно) - BOOL TerminateProcess( HANDLE hProcoss, UINT fuExitCode);
все потоки процесса умирают по своей воле (большая редкость),
1.3 Дочерние процессы
Ваш процесс порождает дочерний и возлагает на него выполнение части операций. Если Вы хотите создать новый процесс, заставить его выполнить какие-либо операции и дождаться их результатов, напишите примерно такой код
PROCESS_INFORMATION pi; DWORD dwExitCode;
// порождаем дочерний процесс BOOL fSuccess = CreateProcess(..., &pi};
if (fSuccess) {
// закрывайте описатель потока, как только необходимость в нем отпадает! CloseHandle(pi hThread);
// приостанавливаем выполнение родительского процесса, // пока не завершится дочерний процесс WaitForSingleObject(pi hProcess, INFINlTI);
// дочерний процесс завершился; получаем код его завершения GetExitCodeProcess(pi.hProcess, &dwExitCode);
// закрывайте описатель процесса, как только необходимость в нем отпадает! CloseHandle(pi.hProcess);
}
В этом фрагменте кода мы создали новый процесс и, если это прошло успешно, вызвали функцию WaitForSingleQbject (ждет определенное время или наступления события)
2. Пример создания процесса:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
void _tmain( int argc, TCHAR *argv[] )
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
if( argc != 2 )
{
printf("Usage: %s [cmdline]\n", argv[0]);
return;
}
// Start the child process.
if( !CreateProcess( NULL, // No module name (use command line)
argv[1], // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
)
{
printf( "CreateProcess failed (%d)\n", GetLastError() );
return;
}
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
3. Задание.
Написать программу, которая принимает в виде параметров несколько названий программ и запускает их в разных процессах.
