process_information ends
进程句柄和进程id是两个不同的概念。进程id好似一个唯一值,而进程句柄是调用相关的windows api 后得到的一个返回值。不能用进程句柄来标识一个进程的唯一性,因为这个值并不唯一。在调用createprocess产生新进程后,该进程就被创建,而且cerateprocess函数立即返回。您可以调用函数getexitcodeprocess来检验进程是否结束。该函数的原型如下:
getexitcodeprocess proto hprocess:dword, lpexitcode:dword
如果调用成功,lpexitcode中包含了所查询进程的状态码。如果等于still_active就表明该进程依旧存在。 您可以调用函数terminateprocess来强制终止一个进程。该函数的原型如下:
terminateprocess proto hprocess:dword, uexitcode:dword
您可以指定任意一个退出值。用该函数结束一个进程并不好,因为该进程加载的动态连接库并不会得到进程正退出的消息。
例子:
在下面的例子中,当用户选择菜单项“crate process”时我们创建一个新进程。它会去执行“"msgbox.exe”。如果用户想要终止新进程,可以选择菜单项“terminate process”。这时,应用程序检查欲终止的进程是否仍存在,若存在则调用terminateprocess函数来终止它。.386
.model flat,stdcall
option casemap:none
winmain proto :dword,:dword,:dword,:dword
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.const
idm_create_process equ 1
idm_terminate equ 2
idm_exit equ 3
.data
classname db "win32asmprocessclass",0
appname db "win32 asm process example",0
menuname db "firstmenu",0
processinfo process_information <>
programname db "msgbox.exe",0
.data?
hinstance hinstance ?
commandline lpstr ?
hmenu handle ?
exitcode dword ? ; contains the process exitcode status from getexitcodeprocess call.
.code
start:
invoke getmodulehandle, null
mov hinstance,eax
invoke getcommandline
mov commandline,eax
invoke winmain, hinstance,null,commandline, sw_showdefault
invoke exitprocess,eax
winmain proc hinst:hinstance,hprevinst:hinstance,cmdline:lpstr,cmdshow:dword
local wc:wndclassex
local msg:msg
local hwnd:hwnd
mov wc.cbsize,sizeof wndclassex
mov wc.style, cs_hredraw or cs_vredraw
mov wc.lpfnwndproc, offset wndproc
mov wc.cbclsextra,null
mov wc.cbwndextra,null
push hinst
pop wc.hinstance
mov wc.hbrbackground,color_window+1
mov wc.lpszmenuname,offset menuname
mov wc.lpszclassname,offset classname
invoke loadicon,null,idi_application
mov wc.hicon,eax
mov wc.hiconsm,eax
invoke loadcursor,null,idc_arrow
mov wc.hcursor,eax
invoke registerclassex, addr wc
invoke createwindowex,ws_ex_clientedge,addr classname,addr appname,\
ws_overlappedwindow,cw_usedefault,\
cw_usedefault,300,200,null,null,\
hinst,null
mov hwnd,eax
invoke showwindow, hwnd,sw_shownormal
invoke updatewindow, hwnd
invoke getmenu,hwnd
mov hmenu,eax
.while true
invoke getmessage, addr msg,null,0,0
.break .if (!eax)
invoke translatemessage, addr msg
invoke dispatchmessage, addr msg
.endw