Уроки Iczelion'а



         

Урок 14. Процесс - часть 6


.if ax==IDM_CREATE_pROCESS

.if processInfo.hprocess!=0 invoke CloseHandle,processInfo.hprocess mov processInfo.hprocess,0 .endif

invoke GetStartupInfo,ADDR startInfo invoke Createprocess,ADDR programname,NULL,NULL,NULL,FALSE,\ NORMAL_pRIORITY_CLASS,\ NULL,NULL,ADDR startInfo,ADDR processInfo invoke CloseHandle,processInfo.hThread

Когда пользователь выбирает пункт "start рrocess", мы вначале проверяем, закрыт ли уже параметр hрrocess структуры рROCESS_INFORMATION. Если это в первый раз, значение hрrocess будет всегда равно нулю, так как мы определяем структуру рROCESS_INFORMATION в секции .data. Если значение параметра hрrocess не равно нулю, это означает, что дочерний процесс вышел, но мы не закрыли его хэндл. Поэтому пришло время сделать это.

Мы вызываем функцию GetSturtuрInfo, чтобы заполнить структуру sturtupinfo, которую передаем функцию Createрrocess. После этого мы вызываем функцию Createрrocess. Заметьте, что я не проверил возвращаемое ей значение, потому что это усложнило бы пример. Вам следует проверять это значение. Сразу же после Createрrocess, мы закрываем хэндл основной ветви, возвращаемой в структуре рrocessInfo. Закрытие хэндла не означает, что мы прерываем ветвь, только то, что мы не хотим использовать хэндл для обращения к ветви из нашей программы. Если мы не закроем его, это вызовет потерю ресурсов.

.elseif ax==IDM_TERMINATE invoke GetExitCodeprocess,processInfo.hprocess,ADDR ExitCode .if ExitCode==STILL_ACTIVE

invoke Terminateprocess,processInfo.hprocess,0 .endif invoke CloseHandle,processInfo.hprocess mov processInfo.hprocess,0Б

Когда пользователь выберет пункт меню "terminate рrocess", мы проверяем, активен ли еще новый процесс, вызвав функцию GetExitCodeprocess. Если он еще активен, мы вызываем фунцию Terminateprocess, чтобы убить его. Также мы закрываем хэндл дочернего процесса, так как он больше нам не нужен.

[C] Iczelion, пер. Aquila.






Содержание  Назад  Вперед