Windows实验报告
华北电⼒⼤学
实验报告
|
|
实验名称验证性试验、设计性试验
课程名称Windows体系及编程
|
|
专业班级:计科0803 学⽣姓名:董世令
学号:200809010302 成绩:
指导教师:王新颖实验⽇期:2011.4.8进程管理实验
⼀、实验⽬的
理解Windows编程环境下的进程管理机制,能创建⼀个完成特定功能的进程,并能对进程进⾏信息的获取、终⽌和保护。
⼆、实验要求
1.编写⼀段程序,能够完成创建进程的功能,要求启动windows记事本程序
(),同时打开⼀个⽂本⽂件,路径为:c:\system\user.log 。并打
印出新建进程ID。
2.获取当前系统进程信息,打印输出进程名称和ID号。
3.终⽌新创建的进程并获取退出代码。
三、实验原理
(1)进程的创建
进程的创建通过CreateProcess()函数来实现,CreateProcess()通过创建⼀个新的进程及在其地址空间内运⾏的主线程来启动并运⾏⼀个新的程序。具体地,在执⾏CreateProcess()函数时,⾸先由操作系统负责创建⼀个进程内核对象,初始化计数为1,并⽴即为新进程创建⼀块虚拟地址空间。随后将可执⾏⽂件或其他任何必要的动态链接库⽂件的代码和数据装载到该地址空间中。在创建主线程时,也是⾸先由系统负责创建⼀个线程内核对象,并初始化为1。最后启动主线程并执⾏进程的⼊⼝函数WinMain(),完成对进程和执⾏线程的创建。
CreateProcess()函数的原型声明如下:
BOOL CreateProcess(
LPCTSTR lpApplicationName, // 可执⾏模块名
LPTSTR lpCommandLine, // 命令⾏字符串
LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程的安全属性
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程的安全属性
BOOL bInheritHandles, // 句柄继承标志
DWORD dwCreationFlags, // 创建标志
LPVOID lpEnvironment, // 指向新的环境块的指针
LPCTSTR lpCurrentDirectory, // 指向当前⽬录名的指针
LPSTARTUPINFO lpStartupInfo, // 指向启动信息结构的指针LPPROCESS_INFORMATION lpProcessInformation // 指向进程信息结构的指针);
(2)进程的获取
进程的定义是为执⾏程序指令的线程⽽保留的⼀系列资源的集合。进程是⼀个可执⾏的程序,由私有虚拟地址空间、代码、数据和其他操作系统资源(如进程创建的⽂件、管道、同步对象等)组成。进程是⼀些所有权的集合,⼀个进程拥有内存、CPU运⾏时间等⼀系列资源,为线程的运⾏提供⼀个环境,每个进程都有它⾃⼰的地址空间和动态分配的内存、线程、⽂件和其他⼀些模块。
系统快照的获取可以通过Win32 API函数CreateToolhelp32Snapshot()来完成,通过该函数不仅可以获取进程的快照,同样可以获取堆、模块和线程的系统快照。函数的声明如下:
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags, //指定要创建包含哪⼀类系统信息的快照函数
DWORD th32ProcessID //指定进程的ID号,当设定为0时表⽰指定当前进程
);
⼀旦系统得到系统快照句柄,就可以对当前的标识号进⾏枚举,进程号通过函数Process32First()和Procee32Next()得到,这两个函数可以⽤于获取系统快照中第⼀个和下⼀个系统的信息,这两个函数的声明如下:
BOOL WINAPI Process32First(
HANDLE hSnapshot, // 系统快照句柄
LPPROCESSENTRY32 lppe // 指向结构体PROCESSENTRY32的指针
);
BOOL WINAPI Process32Next(
HANDLE hSnapshot, // 系统快照句柄
LPPROCESSENTRY32 lppe // 指向结构体PROCESSENTRY32的指针
);
(3)进程的终⽌
终⽌进程也就是结束进程,让进程从内存中卸载。进程的终⽌的原因⼀般有4种。
1)主线程的⼊⼝函数返回。
2)进程中的⼀个线程调⽤ExitProcess函数。
3)次进程中的所有线程结束。
4)其他进程中⼜有线程都结束。
要结束当前进程⼀般让主线程的⼊⼝函数返回。当⽤户的程序⼊⼝函数返回的时候,启动函数会调⽤C/C++运⾏期退出函数EXIT,并将⽤户的返回值传递给它。EXTI函数会销毁所有全局的或静态的C++对象,然后调⽤系统函数ExitProcess促使操作系统终⽌应⽤程序。ExitProcess是⼀个API函数,它会结束当前应⽤程序的执⾏,并设置退出代码,函数声明如下:
Void ExitProcess(UINT uExitCode); //参数uExitCode为此程序的退出代码
四、实验所需仪器、设备、材料(试剂)
Windows操作系统,Microsoft Visual c++6.0或.NET环境,msdn帮助⽂档。
五、实验正⽂
#include "stdafx.h"
#include
#include
#include // 声明快照函数的头⽂件
BOOL TerminateProcessFromId(DWORD dwId)
{
BOOL bRet = FALSE;
/
/ 打开⽬标进程,取得进程句柄
HANDLE hProcess = ::OpenProcess (PROCESS_ALL_ACCESS, FALSE, dwId); //PROCESS_ALL_ACCESS:所有权限,包括创建、读、写等。
//OpenProcess如果成功,则该进程内核对象引⽤计数+1
if(hProcess != NULL)
{
bRet = ::TerminateProcess(hProcess, 0);
CloseHandle(hProcess);//结束了进程,还要使该进程内核对象引⽤计数-1 } return bRet;
}
int main(int argc, char* argv[])
{
char szCommandLine[] = "notepad ";
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
si.dwFlags = STARTF_USESHOWWINDOW; // 指定wShowWindow成员有效si.wShowWindow = TRUE; // 此成员设为TRUE的话则显⽰新建进程的主窗⼝,// 为FALSE的话则不显⽰
BOOL bRet = ::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);
printf(" 新进程的主线程ID号:%d \n", pi.dwThreadId);
}
PROCESSENTRY32 pe32; // 在使⽤这个结构之前,先设置它的⼤⼩
pe32.dwSize = sizeof(pe32); // 给系统内的所有进程拍⼀个快照
HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap == INVALID_HANDLE_VALUE)
{ printf(" CreateToolhelp32Snapshot调⽤失败! \n");
return -1;
}
BOOL bMore = ::Process32First(hProcessSnap, &pe32);// 遍历快照,轮流显⽰每个进程的信息while(bMore)
{ printf(" 进程名称:%s \n", pe32.szExeFile);
printf(" 进程ID号:%u \n\n", pe32.th32ProcessID);
bMore = ::Process32Next(hProcessSnap, &pe32);
}
// 不要忘记清除掉snapshot对象
::CloseHandle(hProcessSnap);
DWORD dwId;
printf(" 请输⼊您要终⽌的进程的ID号: \n");
scanf("%u", &dwId);
if(TerminateProcessFromId(dwId))
{
printf(" 终⽌进程成功! \n");
}
createprocessaelse
{
printf(" 终⽌进程失败! \n");
}
return 0;
}
运⾏结果:
Windows编程基础实验
⼀、实验⽬的
了解windows程序的结构与特点,了解windows程序中⾄关重要的消息机制,包括消息的定义、消息循环以及消息相应函数。熟悉基本的winAPI。
⼆、实验要求
利⽤WIN32API编写WinMain函数,完成窗⼝类的注册,窗⼝的创建,显⽰,更新,并完成消息循环过程。利⽤windows API 实现窗⼝过程函数LRESULT CALLBACK WinProc( ),对WM_CHAR、WM_LBUTTONDOWN、WM_PAINT、
WM_CLOSE、WM_DESTROY消息进⾏响应,并对默认消息进⾏响应。其中,对WM_PAINT的响应要完成窗⼝重
绘,WM_CLOSE响应完成关闭窗⼝,WM_DESTROY完成销毁应⽤程序。
三、实验原理
Windows应⽤程序,操作系统,计算机硬件之间的相互关系
操作系统
输⼊输出设备①②
1. cpu 指令
2.事件:是对计算机操作的动作。每个事件对应⼀个消息,即每个事件发⽣的效果是
产⽣消息。
3.系统调⽤:表⽰应⽤程序可以通知操作系统执⾏某个具体的动作。
4.消息:表⽰操作系统能够将输⼊设备的变化上传给应⽤程序。
Windows 程序采⽤事件驱动模型,它不同于传统的过程驱动模型,如下图所⽰:
由事件驱动模型可知,windows 编程中最基础的部分的就是消息处理。下⾯是消息的定义:
typedef struct tagMSG {
HWND hwnd; //接收窗⼝
UINT message; //消息标识
WPARAM wParam; //附加
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论