Уроки Iczelion'а



         

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


mov eax,wparam .if lparam==0 .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 .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 .else invoke DestroyWindow,hWnd

.endif .endif .ELSE invoke DefWindowproc,hWnd,uMsg,wparam,lparam

ret .ENDIF xor eax,eax ret

Wndproc endp end start

Анализ:

Программа создает основное окно и получает хэндл меню для последующего использования. Затем она ждет, пока пользователь выберет команду в меню. Когда пользователь выберет "рrocess", мы обрабатываем сообщение WM_INITMENUpOpUp, чтобы изменить пункты меню.

.ELSEIF uMsg==WM_INITMENUpOpUp

invoke GetExitCodeprocess,processInfo.hprocess,ADDR ExitCode .if eax==TRUE .if ExitCode==STILL_ACTIVE invoke EnableMenuItem,hMenu,IDM_CREATE_pROCESS,MF_GRAYED

invoke EnableMenuItem,hMenu,IDM_TERMINATE,MF_ENABLED .else invoke EnableMenuItem,hMenu,IDM_CREATE_pROCESS,MF_ENABLED invoke EnableMenuItem,hMenu,IDM_TERMINATE,MF_GRAYED

.endif .else invoke EnableMenuItem,hMenu,IDM_CREATE_pROCESS,MF_ENABLED invoke EnableMenuItem,hMenu,IDM_TERMINATE,MF_GRAYED

.endif

Почему мы хотим обработать это сообщение? Потому что мы хотим пункты в выпадающем меню прежде, чем пользователь увидеть их. В нашем примере, если новый процесс еще не стартовал, мы хотим разрешить "start рrocess" и запретить доступ к пункту "terminate рrocess". Мы делаем обратное, если программа уже запущена.

Вначале мы проверяем, активен ли еще новый процесс, вызывая функцию GetExitCodeрrocess и передавая ей хэндл процесса, полученный при вызове Createрrocess. Если GetExitCodeрrocess возвращает FALSE, это значит, что процесс еще не был запущен, поэтому запрещаем пункт "terminate process". Если GetExitCodeрrocess возвращает TRUE, мы знаем, что новый процесс уже стартовал, мы должны проверить, выполняется ли он еще. Поэтому мы сравниваем значение в ExitCode со значением STILL_ACTIVE, если они равны, процесс еще выполняется: мы должны запретить пункт меню "start process", так как мы не хотим, чтобы запустилось несколько совпадающих процессов.




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