2022年实验:Windows应用程序基础和进程控制归纳 .pdf

上传人:Che****ry 文档编号:35745605 上传时间:2022-08-23 格式:PDF 页数:15 大小:180.77KB
返回 下载 相关 举报
2022年实验:Windows应用程序基础和进程控制归纳 .pdf_第1页
第1页 / 共15页
2022年实验:Windows应用程序基础和进程控制归纳 .pdf_第2页
第2页 / 共15页
点击查看更多>>
资源描述

《2022年实验:Windows应用程序基础和进程控制归纳 .pdf》由会员分享,可在线阅读,更多相关《2022年实验:Windows应用程序基础和进程控制归纳 .pdf(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、实验二: Windows 进程控制1. 实验目的每个进程都有一个独立的受到保护的地址空间,其他进程不能访问。一个进程可以包含一个或更多的线程。进程能够在其内部创建新的、独立的线程, 并且管理对象间的通信和同步。通过对 Windows 系统编程,进一步熟悉操作系统的基本概念,较好地理解Windows 操作系统的系统结构和编程特点。2. 进程控制Windows 所创建的每个进程都从调用CreateProcess() API函数开始,该函数的任务是在对象管理器子系统内初始化进程对象。每一进程都以调用ExitProcess()或 TerminateProcess() API函数终止。通常应用程序的框架

2、负责调用ExitProcess()函数。对 C+ 运行库来说,这一调用发生在应用程序的main()函数返回之后,如果采用C 运行库,则调用WinMain() 函数。通过创建进程、 观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows 进程的生命周期。2.1 进程控制相关的 API 基本的 Win32 进程管理函数是CreateProcess,它可以创建拥有单个线程的进程。因为进程需要代码,所以有必要指定可执行程序文件名作为CreateProcess调用的一部分。CreateProcess 有 10 个参数支持其灵活性和强大功能。该函数并不返回一个H

3、ANDLE ,而是在一个结构(在调用中指定)中返回表示进程和线程的两个句柄。2.1.1 创建进程CreateProcess() 函数函数格式:BOOL CreateProcess(LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR l

4、pCurrentDirectory, LPSTRATUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation); 参数:(1)lpszApplicationName和 lpCommandLine指定了新进程将使用的可执行文件和传递给新进程的命令行字符串。lpszCommandLine 可以设定CreateProcess中用于创建新进程的命令行。CreateProcess在解析lpszCommandLine 字符串的时候,它先查看字符串中的第一个符号。如果它是一个可执行文件名且不含有扩展名,就假定它的扩展名为EXE 。Cre

5、ateProcess将按照以下顺序来搜索可执行文件:1)含有调用进程的EXE文件的目录;2)调用进程的当前目录;3)Windows 系统目录,该目录由GetSystemDirectory 函数得到;4)Windows 目录,该目录由GetWindowsDirectory 函数得到;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 15 页 - - - - - - - - - 5)列在 PATH环境变量中的目录。当然, 如果文件名中包含完整的路径,系统就使用完整路径搜索可执行

6、文件。如果系统找到了可执行文件,就创建一个新进程,并为它生成一个4GB 的地址空间,从而使可执行文件的代码和数据映射到这个地址空间。(2)lpProcessAttribute和 lpThreadAttribute 是指向进程和线程安全属性结构的指针。当用NULL表示时,为默认的安全性。(3)FInheritHandles 表明新进程是否继承调用进程的打开句柄的副本。继承的句柄与原来的句柄具有相同属性。(4)FdwCreate 是几个标志的组合。其中包含以下几个标志:1) CREATE_SUSPENDED : 新进程的主线程创建时处于挂起状态,直到调用ResumeThread函数时才能运行。2)

7、DETACHED_PROCESS和 CREATE_NEW_CONSOLE相互排斥,二者不能同时使用。第一个标志是创建没有控制台的进程,第二个标志是创建新的有控制台的进程。如果二者都没有设置,进程将继承父进程的控制台。3)CREATE_NEW_PROCESS_GROUP指定新进程是新进程组的根进程。如果组中所有的进程都共享同一控制台,则它们都将接收控制台的控制信号。(5) lpvEnvironment指向新进程的环境块。如果此值为NULL , 进程会使用父进程的环境块。环境块包含名称和值字符串,如搜索路径。(6)lpszCurDir指向新进程的驱动器和目录。若为NULL ,将使用父进程的工作目录

8、。(7)lpsiStartInfo 指向新进程的主窗口外观和标准设备句柄。使用GetStartupInfo 函数得到父进程信息。( 8) lpProcessInformation 指 向 包 含 返 回 的 进 程 和 线 程 句 柄 、 进 程 和 线 程 标 识 符 的PROCESS_INFORMATION 结构的指针。返回值:如果进程和主线程创建成功,则返回TRUE 。该函数可使系统创建一个进程内核对象和一个线程内核对象。且打开进程和线程对象,并将与进程相关的每个对象句柄放入PROCESS_INFORMATION 的结构中。PROCESS_INFORMATION结构定义如下:Typede

9、f struct _PROCESS_INFORMATION HANDLE hProcess;/新创建进程的句柄HANDLE hThread;/新创建进程的主线程的句柄DWORD dwProcessId;/新创建进程的标识DWORD dwThreadId;/ 新创建进程的主线程的标识PROCESS_INFORMATION, *LPPROCESS_INFORMATION; 为了保护被创建的对象,系统定义了对象的安全属性结构,其定义如下:Typedef struct _SECURITY_AFFRIBUTES LPVOID lpSecurityDesriptor; BOOL hInheritHandl

10、e; 其中,nLength 代表这个结构的以字节为单位的大小,lpSecurityDescriptor 是控制共享该对象的安全描述符的指针。如果该值为0,该对象被赋予默认的安全描述符。bInheritHandle是一个布尔值,指示返回的对象句柄是否可被新创建进程继承,TRUE表示可以继承。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 15 页 - - - - - - - - - 2.1.2 获得当前进程的标识符GetCurrentProcessId() 函数函数格式:D

11、WORD GetCurrentProcessId(void); 参数:无。返回值:返回当前进程的标识符。2.1.3 挂起当前的执行线程Sleep()函数函数格式:VOID Sleep(DWORD dwMilliseconds); 参数: dwMilliseconds 为指定的挂起执行线程的时间,以毫秒为单位。取值为0 时,该线程将余下的时间片交给处于就绪状态的同一优先级的其他线程。若没有处于就绪状态的同一状态的其他线程,则函数立即返回,该线程继续执行。若取值为INFINITE则造成无限延迟。返回值:该函数没有返回值。2.1.4 关闭对象CloseHandle()函数函数格式:BOOL Clos

12、eHandle(HANDLE hObject); 参数: hObject 代表一个已打开对象的句柄。返回值:执行成功返回TRUE ,否则返回FALSE ,并可以调用GetLastError()获知失败原因。关闭一个内核对象,其中包括文件、文件映射、进程、线程、安全和各种同步对象等。在创建或打开对象成功返回该对象的句柄时,系统会为该对象设置一个打开计数,且将该内核对象的计数加1.该函数的作用与释放动态申请的内存空间类似,这样可以保证系统资源不会泄漏,程序可以在安全的状态下运行。CloseHandle()函数使指定的对象句柄数减1。当对象的句柄计数为0 时,该对象就从系统中被删除。2.1.5 创建

13、子进程的程序示例例 1: 通过显示创建子进程的基本框架,来观察子进程的创建情况。/ 创建子进程的文件 proc_create.cpp#include #include #include / 创建一个克隆的进程并赋予其ID值void StartClone(intnCloneID) / 获得用于当前可执行文件的文件名TCHAR szFilenameMAX_PATH; GetModuleFileName( NULL , szFilename, MAX_PATH); / 创建子进程命令行的格式化,获得应用程序的EXE 文件名和克隆进程的ID值TCHAR szCmdLine MAX_PATH; spri

14、ntf(char *)szCmdLine, %s%d , szFilename, nCloneID); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 15 页 - - - - - - - - - STARTUPINFO si;/ 用于子进程的 STARTUPINFO结构ZeroMemory ( reinterpret_cast(&si), sizeof (si); si.cb =sizeof (si); PROCESS_INFORMATION pi;/ 说明一个用于记录

15、子进程的相关信息的结构变量BOOL bCreateOK = CreateProcess ( szFilename, / 可执行的应用程序的名称szCmdLine, / 指定创建一个子进程的符号标识NULL , / 缺省的进程安全性NULL , / 缺省的线程安全性FALSE , / 不继承打开文件的句柄CREATE_NEW_CONSOLE, / 使用新的控制台NULL , / 新的环境NULL , / 当前目录&si, / 启动信息&pi); / 返回进程和线程信息/ 运行结束,关闭进程和其线程的句柄if (bCreateOK) CloseHandle(pi.hProcess); CloseH

16、andle(pi.hThread); int main( intargc , char * argv) / 确定进程在列表中的位置int nClone(0); if (argc 1) / 从第二个参数中提取克隆IDsscanf( argv1, %d, &nClone); / 显示进程位置printf(Process ID:%d,Clone ID: %dn, GetCurrentProcessId(), nClone); / 创建 2个子进程constint c_nCloneMax = 2; if (nClone c_nCloneMax) StartClone(+nClone); / 发送新进程

17、的命令行和克隆号Sleep(1000); / 暂停 1秒 Sleep(500); / 在终止之前暂停 0.5 秒名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 15 页 - - - - - - - - - return 0; 本例程序展示了一个简单的使用CreateProcess() API函数的例子。首先形成简单的命令行,提供当前的EXE文件的指定文件名和代表生成克隆进程的号码。大多数参数都可取缺省值,但是创建标志参数使用了CREATE_NEW_CONSOLE标志,指示

18、新进程分配它自己的控制台,这使得运行该程序时,在任务栏上产生许多活动标记。然后该克隆进程的创建方法关闭传递过来的句柄并返回main()函数。 在关闭程序之前,每一进程的执行主线程暂停一下,以便让用户看到其中的至少一个窗口。2.2 进程对象相关的函数操作系统将当前运行的应用程序看做是进程对象,利用系统提供的进程唯一的称为句柄(HANDLE )的标识,就可与对应的进程对象交互。2.2.1 得到当前进程的句柄GetCurrentProcess() 函数函数格式:HANDLE GetCurrentProcess(void); 参数:无。返回值:若函数调用成功,返回值为当前进程的句柄。2.2.2 打开一

19、个进程OpenProcess() 函数函数格式:HANDLE OpenProcess(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId); 参数:(1)dwDesiredAccess 为指定进程对象的访问权限;(2) bInheritHandle 为若要子进程获得对该对象的访问权限,就设置为 TRUE , 否则设为 FALSE ;(3)dwProcessId 为指定系统范围内的进程标识符。返回值:若函数调用成功,则返回进程对象的句柄;否则,返回FALSE 。2.2.3 获得进程的优先级类别GetPriorityClass

20、() 函数函数格式:DWORD GetPriorityClass(HANDLE); 参数: HANDLE为指定进程的句柄。返回值: 若函数调用成功, 返回值为指定进程的基本优先级;若函数调用失败, 返回值为 0。如果要了解进程的返回码,就需要有PROCESS_QUERY_INFORMATION的访问权限。2.2.4 改变进程优先级SetPriorityClass() 函数函数格式:BOOL SetPriorityClass(HANDLE hProcess, DWORD dwPriorityClass); 参数: hProcessy为指定进程的句柄,dwPriorityClass 为指定进程要设

21、置的优先级。返回值:函数成功调用,返回值为非0,否则返回值为0。2.2.5 获得系统中当前进程的快照CreateToolhelp32Snapshot() 函数函数格式:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 15 页 - - - - - - - - - HANDLE CreateToolhelp32Snapshot(DWORD dwFlags, DWORD th32ProcessID); 参数: dwFlags 为指定快照中包括系统线程的情况,th32Proces

22、sID 为指定进程的标识符。返回值:若函数调用成功,则返回值为进程快照的句柄。若 参 数dwFlags 为TH32CS_SNAPPROCESS, 则 表 明 快 照 包 括 系 统 中 的 所 有 线 程 , 且th32ProcessID 为包括在快照中进程的进程标识符。2.2.6 将指定的存储空间清0 ZeroMemory 函数函数格式:VOID ZeroMemoery(PVOID Destination, SIZE_T Length); 参数: Destination 为指向分配空间的起始地址,Length 为分配空间字节长度。返回值:该函数没有返回值。2.2.7 获得系统中的第一个进程的

23、快照信息Process32First() 函数函数格式:BOOL Process32First(HANDLE hSnapshot, LPPROCESSENTRY32 lppe); 参数: hSnapshot 为指定快照句柄;lppe 为指向 PROCESSENTRY32结构指针。返回值: 如果返回值为真,则将系统快照中的第一个进程信息复制到PROCESSENTRY32结构的缓冲区中,否则不做任何操作。用 Process32Next()函数指向下一个进程信息,其中PROCESSENTRY32结构定义如下:typedef struct tagPROCESSENTRY32 DWORD dwSize;

24、 DWORD cntUsage; DWORD th32ProcessID; ULONG_PTR th32DefaultHeapID; DWORD th32ModuleID; DWORD cntThreads; DWORD th32ParentProcessID; LONG pcPriClassBase; DWORD dwFlags; TCHAR szExeFileMAX_PATH; PROCESSENTRY32, *PROCESSENTRY32; 2.2.8 获得系统下一个进程的快照信息Process32Next() 函数函数格式:BOOL Process32Next(HANDLE hSnap

25、shot, LPPROCESSENTRY32 lppe); 参数: hSnapshot 为指定快照句柄;lppe 为指定一个PROCESSENTRY32结构。返回值:如果进程列表的下一入口点被复制到缓冲区,返回值为真。2.2.9 获得与进程相关的时间信息GetProcessTimes() 函数函数格式:BOOL GetProcessTimes(HANDLE hProcess, LPFILETIME lpCreationTime, LPFILETIME lpExitTime, LPFILETIME lpKernelTime, LPFILETIME lpUserTime); 名师资料总结 - -

26、-精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 15 页 - - - - - - - - - 参数:hProcess 为一个进程句柄;lpCreationTime 为包含有进程的创建时间的一个FILETIME结构;lpExitTime 为包含有进程的终止时间的一个FILETIME结构;lpKernelTime 为包含有进程在核心态执行时所消耗的时间的一个FILETIME结构;lpUserTime 为包含有进程在用户态执行时所消耗的时间的一个FILETIME结构。返回值:如果函数成功调用,返回值

27、为非0;如果失败,返回值为0。2.2.10 获得进程句柄的程序示例例 2:获得和使用进程句柄/ 获得进程句柄的文件 prochandle.cpp#include #include / 确定自身优先级的一个简单应用程序void main() / 调用如下函数,以获得当前进程的句柄HANDLE hProcessThis = GetCurrentProcess(); / 获得该进程所属的优先级类DWORD dwPriority = GetPriorityClass(hProcessThis); / 显示当前进程所属的优先级类型printf(current process priority: ); s

28、witch (dwPriority) case HIGH_PRIORITY_CLASS: printf(Highn ); break; case NORMAL_PRIORITY_CLASS: printf(Normaln ); break; case IDLE_PRIORITY_CLASS: printf(Idlen); break; case REALTIME_PRIORITY_CLASS: printf(Realtimen); break; default : printf(n ); break; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - -

29、 - - - - - 名师精心整理 - - - - - - - 第 7 页,共 15 页 - - - - - - - - - 本例列出的是一种获得进程句柄的方法。对于进程句柄可进行的唯一有用的操作是在API调用时,将其作为参数传送系统,如程序中的GetPriorityClass()函数的调用所带的就是进程的句柄。在这种情况下,系统查看进程对象,以决定其优先级,然后将此优先级返回给应用程序。使用OpenProcess()和 CreateProcess()函数也可以用于获得进程句柄,前者获得的是已经存在的进程的句柄,而后者创建一个新进程,并返回其句柄。2.2.11 利用句柄获得进程详细信息的程序示

30、例例 3:利用进程句柄查出进程的详细信息。/ 获得进程句柄信息的文件proclist.cpp/#include #include #include usingnamespace std; #pragma comment ( lib , kernel32.lib) / 当在用户态及核心态下都提供所耗时间时,计算在核心态下所消耗的时间(以64位表示)DWORD GetKernelModePercentage(constFILETIME& ftKernel, constFILETIME& ftUser ) / 将FILETIME结构转化为 64位整数ULONGLONG qwKernel = (ULO

31、NGLONG) ftKernel.dwHighDateTime) 32) + ftKernel.dwLowDateTime; ULONGLONG qwUser = (ULONGLONG) ftUser .dwHighDateTime) 32) + ftUser .dwLowDateTime; / 将消耗时间相加,然后计算消耗在核心态下所用时间百分比ULONGLONG qwTotal = qwKernel + qwUser; DWORD dwPct = (DWORD)(ULONGLONG)100 * qwKernel) / qwTotal); return dwPct; / 应用程序显示当前运行

32、进程名字以及在核心态下占用时间的百分比void main() / 获得系统当前进程的快照HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, / 获得当前进程0); / 如果是当前进程,就将其忽略/ 初始化过程入口PROCESSENTRY32 pe; / 声明进程入口的 PROCESSNTRY32结构的变量名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 15 页 - - - - - - - - -

33、 ZeroMemory (&pe, sizeof (pe) );/ 为pe分配存储空间,并将其清0pe.dwSize = sizeof (pe); BOOL bMore = Process32First(hSnapshot, &pe); / 获得系统快照中的第一个进程信息while (bMore) / 打开用于读取的进程HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION, / 指明要得到信息FALSE , / 不必继承这一句柄pe.th32ProcessID); / 要打开的进程if (hProcess != NULL ) / 找出

34、进程的时间FILETIME ftCreation, ftKernelMode, ftUserMode, ftExit; GetProcessTimes( hProcess, / 所感兴趣的进程&ftCreation, / 进程的启动时间&ftExit, / 结束时间&ftKernelMode, / 在核心态下消耗的时间&ftUserMode); / 在用户态下消耗的时间/ 计算核心态下消耗的时间百分比DWORD dwPctKernel = GetKernelModePercentage(ftKernelMode, ftUserMode); / 向用户显示进程的某些信息cout process

35、ID: pe.th32ProcessID , EXE file: pe.szExeFile ,%in Kernel mode: dwPctKernel endl; / 关闭句柄CloseHandle(hProcess); / 转向下一个进程bMore = Process32Next (hSnapshot, &pe); 该程序首先利用Windows 系统的新特性 (即工具帮助库) ,来获得当前运行的所有进程的快照。然后应用程序进入快照中的每一个进程,得到其以PROCESSENTRY32 结构表示的属性,这一结构用来向OpenProcess()函数提供进程的ID。Windows 跟踪每一个进程的有

36、关时间,本例是通过打开的进程句柄和GetProcessTimes()函数来直接得到有关时间,接下来计算进程在核心态下消耗的时间占总时间的百分比。程序的其余部分比较简单,只是将有关信息显示给用户,关闭进程句柄,然后继续循环,直到所有进程都计算完为止。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 15 页 - - - - - - - - - 2.3 运行进程对于在系统中的每个进程来说,当它至少拥有一个执行线程时就是运行的。通常情况下,进程使用主线程作为其生命周期指示器。当主

37、线程结束时,调用ExitProcess() API 函数,通知系统终止它所拥有的所有正在运行、准备运行或正在挂起的其他线程。当进程正在进行时,通过下面一些API,可以获得它的许多特性。2.3.1 获得一个进程的启动信息GetStartupInfo()函数函数格式:VOID GetStartupInfo(LPSTARTUPINFO lpStartupInfo); 参数: lpStartupInf 为 STARTUPINFO 结构,该结构用于最终载入进程的启动信息。返回值:无。2.3.2 获得系统关闭时当前进程与其他进程关闭的迟早情况GetProcessShutdownParameters() 函

38、数函数格式:BOOL GetProcessShutdownParameters(LPDWORD lpdwLevel, LPDWORD lpdwFlags); 参 数 : lpdwLevel为 指 定 关 闭 优 先 级 ; lpdwFlags为 指 定 关 闭 标 志 , 若 指 定 为SHUTDOWN-NORETRY 标志,如关闭一个进程超时,会出现一个重试对话框。通过设置这个标志,就可以禁止那个对话框显示出来,并直接关闭进程。返回值:如果函数执行成功,返回值为非0,否则返回值为0。2.3.3 系统关闭时指定当前进程与其他进程关闭的顺序SetProcessShutdownParameters

39、() 函数函数格式:BOOL SetProcessShutdownParameters(DWORD dwlevel, DWORD dwFlags); 参数: dwLevel 指向进程关闭优先级,系统按照从高到低优先级关闭进程;dwFlags 可以为SHUTDOWN_NORETRY 值,当系统关闭进程时不出现RETRY对话框。返回值:函数成功调用,返回值为非0,否则返回值为0。2.3.4 获得当前命令行缓冲区的一个指针GetCommandLine() 函数函数格式:LPTSTR GetCommandLine(void); 参数:无返回值:如果函数执行成功,返回命令缓冲区在内存中的地址。2.3.5

40、 查询进程进行的操作系统版本信息GetProcessVersion() 函数函数格式:DWORD GetProcessVersion(DWORD processId)参数: ProcessId为指定进程的标识符返回值:如果函数执行成功,返值为系统版本信息。2.3.6 提取与平台和操作系统的版本相关的信息GetVersionEx() 函数函数格式:BOOL GetVersionEx(LPOSVERSIONINFO lpVersionInfo); 参数: lpVersionInfo 为指向 OSVERSIONINFOEX 结构,该结构用于装载操作系统的版本信息。返回值:如果函数执行成功,返回值为非

41、0,否则返回值为0。2.3.7 关闭前台应用程序优先级的提升SetProcessPriorityBoost() 函数函数格式:BOOL SetProcessPriorityBoost(HANDLE hProcess, BOOL DisablePriorityBoost); 参数: hProcess为指定进程的句柄,DisablePriorityBoost 为指定可否提升优先级的标志。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 15 页 - - - - - - - -

42、 - 返回值:如果函数执行成功,返回值为非0,否则返回值为0。2.3.8 设置进程可用的最大和最小工作集SetProcessWorkingSet() 函数函数格式:BOOL SetProcessWorkingSet(HANDLE hProcess, SIZE_T dwMinimumWorkingSetSize, SIZE_T dwMaximumWorkingSetSize); 参数: hProcess为指定进程的句柄,dwMinimumWorkingSetSize为进程最小工作区域的字节数, dwMaximumWorkingSetSize 为进程最大工作区域的字节数。返回值:如果函数执行成功,

43、返回值为非0,否则返回值为0。2.3.9 获取运行进程操作系统版本号的程序示例例 4:获得运行进程的操作系统版本号。/ 获取运行进程操作系统版本号的程序version.cpp#include #include usingnamespace std; / 利用进程和操作系统的版本信息的简单示例void main() DWORD dwIdThis = GetCurrentProcessId();/ 获得进程的 ID号DWORD dwVerReq = GetProcessVersion(dwIdThis);/ 获得进程和报告使用的操作系统版本WORD wMajorReq = ( WORD)(dwVe

44、rReq 16);/ 获得操作系统的主版本号WORD wMinorReq = ( WORD)(dwVerReq & 0 xffff);/ 获得操作系统的次版本号printf(Process ID: %d, requires OS: %d%dn, dwIdThis, wMajorReq, wMinorReq); / 设置版本信息的数据结构,以便保存操作系统的版本信息OSVERSIONINFOEX osvix; ZeroMemory (&osvix, sizeof (osvix); osvix.dwOSVersionInfoSize = sizeof (osvix); / 提取版本信息和报告Get

45、VersionEx (reinterpret_cast(&osvix); printf(Running on OS: %d.%dn, osvix.dwMajorVersion, osvix.dwMinorVersion); / 如果是 Windows NT5(windows 2000)系统,那么将其提升为高优先权if (osvix.dwPlatformId = VER_PLATFORM_WIN32_NT & osvix.dwMajorVersion = 5) / 改变当前运行进程的优先级为高SetPriorityClass( GetCurrentProcess(), / 得到该进程的 IDHI

46、GH_PRIORITY_CLASS); / 改变为 high/ 报告给用户printf(Task Manager should now indicate this); printf(process is high priority.n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 15 页 - - - - - - - - - 该程序展示了如何获得当前进程标识符PID和进程运行的操作系统的版本信息。为了运行这一程序,系统处理了所有的版本不兼容问题。接着,程序演示了如

47、何使用GetVersionEx()函数来提取OSVERSIONINFOEX 结构。该结构中包括了操作系统的版本信息,Window 2000/XP在此数据块内是以Windows NT 5.1 表示的。程序的最后一段利用了操作系统的版本信息,以确认运行的是Windows 2000 还是Windows XP。代码接着将当前进程的优先级提升到高优先级。在 Windows2000/XP 中增加了ABOVE_NORMAL_PRIORITY_CLASS级别,它介于NORMAL_PRIORITY_CLASS 和HIGH_PRIORITY_CLASS之间。当右击该进程名以改变其优先级时,任务管理器 ” 应用程序

48、应该立即反映这个变化。2.4 进程终止和进程同步等待所有进程都是以调用ExitProcess()或 TerminateProcess()函数结束的。前者是在进程完成了它的所有的关闭“ 职责 ” 之后以正常的终止方法来调用的,而后者是外部进程发生故障后终止进程时调用的,由于关闭时的途径不太正常,有可能引起错误的行为。只要用PROCESS_TERMINATE 访问权打开一个进程对象,TerminateProcess()函数就可以终止该进程,并向系统返回指定的终止码。这是一种“ 野蛮” 的终止进程的方式,但是有时却是需要的。进程同步是指一个进程或线程可以通过调用系统的相应函数等待一个或多个内核对象变

49、为有信号状态,来实现进程或线程与这些内核对象的同步。能够作为同步对象的有进程、线 程 、 文 件 、 事 件 、 互 斥 体 、 信 号 量 等 。 这 里 主 要 介绍 等 待 一 个 或多 个 内 核 对 象WaitForsingleObject() 或 WaitForMultipleObjects() 函数。2.4.1 进程终止1)进程正常终止ExitProcess()函数函数格式:VOID ExitProcess(UINT uExitCode); 参数: uExitCode 为终止进程的退出码。返回值:无。2)中止指定句柄的进程TerminateProcess()函数函数格式:BOOL

50、 TerminateProcess(HANDLE hProcess, UINT uExitCode); 参数: hProcess为指定要中断的那个进程的句柄,uExitCode 为进程的一个退出码。返回值:函数成功调用,返回值为非0,否则返回值为0。2.4.2 获取指定句柄的已终止进程的退出码GetExitCodeProcess() 函数函数格式:BOOL GetExitCodeProcess(HANDLE hProcess, LPDWORD lpExitCode); 参数: hProcess 为指定终止的那个进程的句柄;uExitCode 为用于获得进程退出码的一个整数变量。返回值:函数成功

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁