《手持式移动设备嵌入式WinCE开发(进程).ppt》由会员分享,可在线阅读,更多相关《手持式移动设备嵌入式WinCE开发(进程).ppt(18页珍藏版)》请在三一办公上搜索。
1、手持式移动设备嵌入式WinCE开发,6,进程,第,章,本章目标,掌握进程的概念,熟练掌握进程的创建、终止及其他进程操作函数,掌握并理解进程间的通信,进程与程序关系:联系 程序是构成进程的两个组成部分之一区别程序是静态的,进程是动态的程序可以在长期保存,而进程有它的生命周期,不能长期保存一个程序可对应多个进程,而一个进程只能对应一个程序。,进程,每个应用程序启动后,就会变成一个单独的进程,并且每个进程都有自己的虚拟内存空间。操作系统可以列举系统的活动进程,并且可以根据进程句柄执行“终止进程”和“激活进程”等操作。每个进程都有自己的虚拟内存空间,因此各进程间相互独立,互不干扰。在某些情况下,需要在
2、两个或者多个进程间进行通信,所以我们需要掌握进程间的通信方法。,进程概述,进程(Process)是指当前所加载程序的专业Win32术语,磁盘上的一个可执行文件仅仅是一个文件,它只有在被启动后才是一个进程。进程仅仅是存在的,它不做任何事,一个进程可以有多个线程但至少应包含一个线程,程序中所有的操作都是由线程来完成的。同时每一个进程有且仅有一个主线程,由主线程来进行所有初始化操作。UNIX、OS/2.Windows 2000/NT、Windows 95/98以及Windows CE系统等都是基于多线程的操作系统,WinCE的进程与Windows NT或Windows 2000中的进程有所不同,而最
3、重要的不同点就是:在WinCE中任意一个时刻晟多可以有32个进程同肘运行。当系统启动时,至少会创建4个进程:NK.EXE提供内核服务;FILESYS.EXE提供文件系统服务;GWES.EXE提供GUI支持;DEVICE.EXE加载和维护设备驱动程序。在大多数系统中,系统还将根据需要创建一些进程,例如在PPC2002启动后,除了创建上述的4个核心进程外,同时还会创建6个进程。,Windows CE进程结构分析,Windows CE中,每一个进程由process结构来描述,也就是进程控制块(PCB,Process Control Block);系统创建一个进程时,将分配一个新的process结构;
4、进程结束时,这个结构将被回收;与 Windows 98或NT 进程比较,Windows CE进程包含较少的状态信息;进程是系统资源分配的基本单位。,进程创建,进程创建进程的创建可以通过CreateProcess API函数来完成,该函数的声明如下:BOOL CraateProcess LPCWSTR pszImageName,指向可执行文件名的指针 LPCWSTR pszCmdLine,指向执行命令字符串的指针 LPSECURITY_ATTRIBUTES psaProcess,指向进程安全属性的指针,CE不支持 LPSECURITY_ATTRIBUTES psaThread,指向线程安金属性的
5、指针,CE不支持 B00L fInherit,Handles,被创建的进程是否继承创建进程的句柄,CE小支持 DWORD fc:hrCreate,创建标志 PVOID pvEnvironment,指向新创建的环境块的指针CE水支持 LPWSTR pszCurDir,指I句当前工作目录的指针,CE不支持 LPSTARTUPINFOW psiStartlnfo,指向进程启动信息结构体的指针,CE不支持 LPPROCE SS工NFDRMATIO!q pPro cln fo 指向进程信息结构体的指针);,在CE中,CreateProcess函数中的许多参数是不被支持的,因此很多参数都要被设置成NULL
6、,所以实际上它可以被看成如下声明:BOOL CreateProcess LPCWSTR pszImageName,LPCWSTR pszCmdLine,NULL,NULL,NULL,DWORD fdwCreate,NULL,NULL,NULL,LPPROCESS_INFORMATION pProclnfo 参数pszlmageName表示可执行文件名,任CE中,必须要指定应用程序名,不能设置成NULL。,进程终止 CE小支持NT等所支持的ExitProcess函数,但是在CE中,如果主线程终止了,进程也将终止,而不管进程的当前活动状态,因此在CE中可以通过进程的主线程调用ExitThread来
7、终止进程。此外,通过调用GetExitCodeProcess函数,可以确定进程是否终止。GetExitCodeProcess函数的声明如下:BOOL GetExitCodeProcess HANDLE hProcess,LPDWORD lpExitCode;,如果要关闭的进程是用户自己创建的进程,则可以使用进程间通信告诉进程终止它自身。除此之外,还有一种终止进程的方法,就是给该进程的主窗口发送WM_CLOSE消息。如果上述方法都失败了,则可以使用TerminateProcess函数来终止进程。TerminateProcess函数的声明如下:BOOL TerminateProcess(HANDL
8、E hProcess,DWORD uExitCode);参数hProcess代表要终止进程的句柄。参数uExitCode指终止进程返回的退出代码。函数返回TRUE表示成功终止进程,否则终止进程失败。,其他进程函数1OpenProcess函数函数OpenProcess用于根据进程ID标识返回一个己运行进程的句柄,该函数的声明如下:HANDLE OpenProcess(DWORD fdwAccess,BOOL flnherit,DWORD IDProcess);由于CE不支持fdwAccess参数,因此应将其设置为0,而参数flnherit则必须被设置成FALSE,因为CE不支持句柄继承,参数ID
9、Process指要打开进程的进程ID值。OpenProcess函数的返回值是得到的进程句柄,如果返回值为NULL,则表示得到进程句柄失败。,GetWindowThreadProcessld函数 函数GetWindowThreadProcessld用丁得到创建宙体的进程ID值和创建宙体的线程ID值,该函数的声明如下:DWORD GetWindowThreadProcessld(HWND hWficl.LPDWORD lpdwProcessld);参数hWnd指被创建的窗体句柄。参数lpdwProcessld为接收创建此窗体的进程ID值。函数的返回值代表创建此窗体的线程ID值。上面讲述的两个雨数,
10、在实际操作中使用得比较少。但是在下而章节中介绍的“进程列举并管理”的例了巾将会用到GetWindowThreadProcessld函数,到时读者可以慢慢品味它。,3.ReadProcessMemory扣WriteProcessMemory函数 除上面介绍的两个函数外,还有两个可以直接读取井写入某个进程的内存空间的函数ReadProcessMemory和WriteProcessMemory。这两个函数的具体声明如1卜_:BOOL ReadProcessMemory(HANDLE hProcess,LPCVOID lpEaseAddress,LPVOID lpBuffer,DWORD nSize,
11、LPDWORD lpNurnberOfBytesRead)j BOOL WriteProcessMemory(HANDLE hProcess,LPVOID lpBaseAddress,LPVOID lpBuffer,DWORD nSize,LPDWORD lpNumberOfBytesWritten);参数hProcess指定要操作的进程句柄。参数lpBaseAddress指定要读取的或写入的进程地址卒间基地址。参数lpBuffer和参数nSize分别表示竖读取和写入的本地缓冲区和大小。参数lpNumberOfBytesRead(lpNumberOfBytesWritten)表示实际读取或写入
12、韵字节数。这两个蛹数在使用时,被读取或写入的整个内存区域必须能够被访问,否则函数将执行失败。一般柬说这两个函数被更多地应用在程序调试_T作中。,进程列举并管理”实例 在编写“进程列举并管理”的例子之前,先让我们来共同熟悉一下它所使用的基本技术。,1TooLHelp 首先要说明的是TooIHelp。TolHelp是CE API的时部分,用于获取操作系统的某些底层信息,尤其是关于当前正在运行的进程以及每个进程下的线程、模块和堆信息。无论是对于普通的程序开发人员还是高级程序员,获取这些信息都是非常必要的。TooIHelp API都存储在一个叫TOOLHELP.DLL的动态链接库中,因此在用户使用时,
13、必须先加载此动态库,才可使用其中的API。,2快照(Snapshots)接下来要说明的是快照(Snapshots)的概念。CE是多任务的,经常需要创建、修改或删除诸如进程、线程、模块、堆等对象。由于系统的各种状态经常处于变动当中,系统信息现在有意义,不代表过一会还有意义。例如想要列举操作系统中所加载的模块,由于操作系统有可能正在动态地调度线程的执行,因此即使已经列举出许多的模块,但是可能还有些模块正在创建和删除。在这样一种动态环境中,为了获取诸如此类的信息,虽好是能够把系统冻结一段时间。尽管65 6CC XCTooIHelp无法冻结系绕,但它可以给某一时刻的系统拍一个快照,我们可以在快照里来慢慢查询我们所需要的信息。创建系统快照需要调用CreateToolhelp32Snapshot函数。CreateToolhelp32Snapshot函数的具体声明如下:HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags,DWORD th32ProcessID)j 其中参数dwFlags用于指定快照中要包含的信息种类,