windows体系编程Word文档下载推荐.docx
《windows体系编程Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《windows体系编程Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
日期:
2014年6月6日
一、课程设计(综合实验)的目的与要求
1.正文为宋体,五号字行间距为21
1.1------------
1.2------------
二、设计(实验)正文
三、课程设计(综合实验)总结或结论
四、参考文献
[1]作者1,作者2书名.出版单位,版本.出版日期
附录(设计流程图、程序、表格、数据等)
注:
根据课程设计、综合实验的内容将标题任选其一。
实验一类Windows进程任务管理器实验
一、实验目的
理解Windows编程环境下的进程管理机制,能创建一个完成特定功能的进程,并能对进程进行信息的获取、终止和保护,实现一个类Windows的进程任务管理器
二、实验要求
程序可为控制台或带界面应用程序,要求有较好的用户体验,完成功能:
1.能够完成创建进程的功能,打印输出新建进程ID。
2.获取当前系统进程信息,列出可选显示进程信息项,根据选择显示输出进程信息。
3.终止任意进程并获取退出代码。
4.具体实现技术不限
三、实验原理
(1)进程的创建
进程的创建通过CreateProcess()函数来实现,CreateProcess()通过创建一个新的进程及在其地址空间内运行的主线程来启动并运行一个新的程序。
具体地,在执行CreateProcess()函数时,首先由操作系统负责创建一个进程内核对象,初始化计数为1,并立即为新进程创建一块虚拟地址空间。
随后将可执行文件或其他任何必要的动态链接库文件的代码和数据装载到该地址空间中。
在创建主线程时,也是首先由系统负责创建一个线程内核对象,并初始化为1。
最后启动主线程并执行进程的入口函数WinMain(),完成对进程和执行线程的创建。
CreateProcess()函数的原型声明如下:
BOOLCreateProcess(
LPCTSTRlpApplicationName,//可执行模块名
LPTSTRlpCommandLine,//命令行字符串
LPSECURITY_ATTRIBUTESlpProcessAttributes,//进程的安全属性
LPSECURITY_ATTRIBUTESlpThreadAttributes,//线程的安全属性
BOOLbInheritHandles,//句柄继承标志
DWORDdwCreationFlags,//创建标志
LPVOIDlpEnvironment,//指向新的环境块的指针
LPCTSTRlpCurrentDirectory,//指向当前目录名的指针
LPSTARTUPINFOlpStartupInfo,//指向启动信息结构的指针
LPPROCESS_INFORMATIONlpProcessInformation//指向进程信息结构的指针
);
(2)进程的获取
进程的定义是为执行程序指令的线程而保留的一系列资源的集合。
进程是一个可执行的程序,由私有虚拟地址空间、代码、数据和其他操作系统资源(如进程创建的文件、管道、同步对象等)组成。
进程是一些所有权的集合,一个进程拥有内存、CPU运行时间等一系列资源,为线程的运行提供一个环境,每个进程都有它自己的地址空间和动态分配的内存、线程、文件和其他一些模块。
系统快照的获取可以通过Win32API函数CreateToolhelp32Snapshot()来完成,通过该函数不仅可以获取进程的快照,同样可以获取堆、模块和线程的系统快照。
函数的声明如下:
HANDLEWINAPICreateToolhelp32Snapshot(
DWORDdwFlags,//指定要创建包含哪一类系统信息的快照函数
DWORDth32ProcessID//指定进程的ID号,当设定为0时表示指定当前进程
一旦系统得到系统快照句柄,就可以对当前的标识号进行枚举,进程号通过函数Process32First()和Procee32Next()得到,这两个函数可以用于获取系统快照中第一个和下一个系统的信息,这两个函数的声明如下:
BOOLWINAPIProcess32First(
HANDLEhSnapshot,//系统快照句柄
LPPROCESSENTRY32lppe//指向结构体PROCESSENTRY32的指针
BOOLWINAPIProcess32Next(
(3)进程的终止
终止进程也就是结束进程,让进程从内存中卸载。
进程的终止的原因一般有4种。
1)主线程的入口函数返回。
2)进程中的一个线程调用ExitProcess函数。
3)次进程中的所有线程结束。
4)其他进程中又有线程都结束。
要结束当前进程一般让主线程的入口函数返回。
当用户的程序入口函数返回的时候,启动函数会调用C/C++运行期退出函数EXIT,并将用户的返回值传递给它。
EXTI函数会销毁所有全局的或静态的C++对象,然后调用系统函数ExitProcess促使操作系统终止应用程序。
ExitProcess是一个API函数,它会结束当前应用程序的执行,并设置退出代码,函数声明如下:
VoidExitProcess(UINTuExitCode);
//参数uExitCode为此程序的退出代码
四、实验所需仪器、设备、材料(试剂)
Windows操作系统,MicrosoftVisualc++6.0或.NET环境,msdn帮助文档。
五、实验正文
//02CreateProcess.cpp文件
//#include"
stdafx.h"
#include<
windows.h>
stdio.h>
tlhelp32.h>
//声明快照函数的头文件
intCreateProcess(){
charszCommandLine[]="
notepadc:
\\user.log"
;
STARTUPINFOsi={sizeof(si)};
PROCESS_INFORMATIONpi;
si.dwFlags=STARTF_USESHOWWINDOW;
//指定wShowWindow成员有效
si.wShowWindow=TRUE;
//此成员设为TRUE的话则显示新建进程的主窗口,
//为FALSE的话则不显示
BOOLbRet=:
:
CreateProcess(
NULL,//不在此指定可执行文件的文件名
szCommandLine,//命令行参数
NULL,//默认进程安全性
NULL,//默认线程安全性
FALSE,//指定当前进程内的句柄不可以被子进程继承
CREATE_NEW_CONSOLE,//为新进程创建一个新的控制台窗口
NULL,//使用本进程的环境变量
NULL,//使用本进程的驱动器和目录
&
si,
pi);
if(bRet)
{
//既然我们不使用两个句柄,最好是立刻将它们关闭
:
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
printf("
新进程的进程ID号:
%d\n"
pi.dwProcessId);
新进程的主线程ID号:
pi.dwThreadId);
}
return0;
}
intListProcess(){
PROCESSENTRY32pe32;
//在使用这个结构之前,先设置它的大小
pe32.dwSize=sizeof(pe32);
//给系统内的所有进程拍一个快照
HANDLEhProcessSnap=:
CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap==INVALID_HANDLE_VALUE)
CreateToolhelp32Snapshot调用失败\n"
return-1;
//遍历进程快照,轮流显示每个进程的信息
BOOLbMore=:
Process32First(hProcessSnap,&
pe32);
while(bMore)
进程名称:
%s\n"
pe32.szExeFile);
进程ID号:
%u\n\n"
pe32.th32ProcessID);
bMore=:
Process32Next(hProcessSnap,&
//不要忘记清除掉snapshot对象
:
CloseHandle(hProcessSnap);
BOOLTerminateProcessFromId(DWORDdwId)
{
BOOLbRet=FALSE;
//打开目标进程,取得进程句柄
HANDLEhProcess=:
OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwId);
if(hProcess!
=NULL)
//终止进程
//GetExitCodeProcess(hProcess,&
ExitCode);
bRet=:
TerminateProcess(hProcess,0);
CloseHandle(hProcess);
returnbRet;
intTiminateProcess(){
DWORDdwId;
printf("
请输入您要终止的进程的ID号:
\n"
scanf("
%u"
&
dwId);
if(TerminateProcessFromId(dwId))
终止进程成功!
else
终止进程失败!
intmain(intargc,char*argv[])
intchoice;
//
while
(1){
请选择功能:
\n1.新建进程\n2.列出进程表\n3.终止进程"
scanf("
%d"
&
choice);
switch(choice){
case1:
CreateProcess();
break;
cas