Азбука программирования в Win32 API


Азбука программирования в Win32 API - стр. 189


226

код завершения меняется со STILL ACTIVE на код, записываемы!! в uExitCode;

счетчик числа пользователей процесса уменьшается на единицу (заметим, что данные процесса удаляются из памяти, но сам объект остается в памяти до того момента, пока счетчик пользователей не дос­тигнет нулевого -.шачения, или, другими словами, пока не будут закрыты все хэндлы процесса. Определить, завершен ли процесс можно с помо­щью функции GetExitProcessCode(), которая в случае незавершенности процесса возвращает STILL ACTIVE).

Необходимо отметить, что завершение процесса не приводит к завер­шению порожденных им процессов.

Сразу после деинициализации и выгрузки библиотек из памяти, по до своего завершения, функция заносит в параметр uExitCode код заверше­ния. После этого процесс можно считать полностью завершенным.

ФУНКЦИЯ TERMINATEPROCESSO

Эта функция является аварийным средством завершения процесса и её рекомендуется использовать только в крайнем случае. Она описана в том же winbase.li:

WINBASHAPI BOOL WINAPI Termm;UeProcess(HANDLE hProccss,

UlNTuExilCodc);

Функция используется только тогда, когда иными средствами завер­шить процесс не удается. С этой целью извне (!), а не изнутри процесса вызывается функция TerminateProcess(). которая и завершает процесс. Но в данном случае не освобождаются используемые процессом DLL, хотя все используемые объекты освобождаются. Освобождается также и память, занимаемая процессом. Число пользователей процесса также уменьшается.

Отметим один интересный факт. Обычно один процесс запускает дру­гой как обособленный и после запуска забывает о нем. Для того чтобы порожденный процесс мог быть завершен, сразу после создания процесса порождающий процесс должен закрыть хэндл порожденного процесса и его потока. Делается это примерно следующим образом:

PROCESS INFORMATION Processlnformation;

BOOL hMyProcess;

if ((hMyProcess = CreateProcess(...... &ProcessInformation))

{

CloseHandle(ProcessInfonnation.hThread);

CloseHandle(ProcessInformation.hProcess);




Начало  Назад  Вперед



Книжный магазин