Windows实验报告_第1页
Windows实验报告_第2页
Windows实验报告_第3页
Windows实验报告_第4页
Windows实验报告_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、华北电力大学实 验 报 告| 实验名称 验证性试验、设计性试验 课程名称 windows体系及编程 | 专业班级: 计科0803 学生姓名:董世令 学 号:200809010302 成 绩:指导教师:王新颖 实验日期:2011.4.8进程管理实验一、实验目的 理解windows编程环境下的进程管理机制,能创建一个完成特定功能的进程,并能对进程进行信息的获取、终止和保护。二、实验要求 1. 编写一段程序,能够完成创建进程的功能,要求启动windows记事本程序(notepad.exe),同时打开一个文本文件,路径为:c:systemuser.log 。并打印出新建进程id。2. 获取当前系统进程

2、信息,打印输出进程名称和id号。3. 终止新创建的进程并获取退出代码。三、实验原理(1)进程的创建进程的创建通过createprocess()函数来实现,createprocess()通过创建一个新的进程及在其地址空间内运行的主线程来启动并运行一个新的程序。具体地,在执行createprocess()函数时,首先由操作系统负责创建一个进程内核对象,初始化计数为1,并立即为新进程创建一块虚拟地址空间。随后将可执行文件或其他任何必要的动态链接库文件的代码和数据装载到该地址空间中。在创建主线程时,也是首先由系统负责创建一个线程内核对象,并初始化为1。最后启动主线程并执行进程的入口函数winmain(

3、),完成对进程和执行线程的创建。createprocess()函数的原型声明如下:bool createprocess(lpctstr lpapplicationname, / 可执行模块名lptstr lpcommandline, / 命令行字符串lpsecurity_attributes lpprocessattributes, / 进程的安全属性 lpsecurity_attributes lpthreadattributes, / 线程的安全属性 bool binherithandles, / 句柄继承标志 dword dwcreationflags, / 创建标志 lpvoid lp

4、environment, / 指向新的环境块的指针 lpctstr lpcurrentdirectory, / 指向当前目录名的指针 lpstartupinfo lpstartupinfo, / 指向启动信息结构的指针 lpprocess_information lpprocessinformation / 指向进程信息结构的指针 );(2)进程的获取进程的定义是为执行程序指令的线程而保留的一系列资源的集合。进程是一个可执行的程序,由私有虚拟地址空间、代码、数据和其他操作系统资源(如进程创建的文件、管道、同步对象等)组成。进程是一些所有权的集合,一个进程拥有内存、cpu运行时间等一系列资源,为

5、线程的运行提供一个环境,每个进程都有它自己的地址空间和动态分配的内存、线程、文件和其他一些模块。系统快照的获取可以通过win32 api函数createtoolhelp32snapshot()来完成,通过该函数不仅可以获取进程的快照,同样可以获取堆、模块和线程的系统快照。函数的声明如下:handle winapi createtoolhelp32snapshot(dword dwflags, /指定要创建包含哪一类系统信息的快照函数dword th32processid /指定进程的id号,当设定为0时表示指定当前进程);一旦系统得到系统快照句柄,就可以对当前的标识号进行枚举,进程号通过函数p

6、rocess32first()和procee32next()得到,这两个函数可以用于获取系统快照中第一个和下一个系统的信息,这两个函数的声明如下:bool winapi process32first(handle hsnapshot, / 系统快照句柄lpprocessentry32 lppe / 指向结构体processentry32的指针);bool winapi process32next(handle hsnapshot, / 系统快照句柄lpprocessentry32 lppe / 指向结构体processentry32的指针);(3)进程的终止终止进程也就是结束进程,让进程从内存

7、中卸载。进程的终止的原因一般有4种。1) 主线程的入口函数返回。2) 进程中的一个线程调用exitprocess函数。3) 次进程中的所有线程结束。4) 其他进程中又有线程都结束。要结束当前进程一般让主线程的入口函数返回。当用户的程序入口函数返回的时候,启动函数会调用c/c+运行期退出函数exit,并将用户的返回值传递给它。exti函数会销毁所有全局的或静态的c+对象,然后调用系统函数exitprocess促使操作系统终止应用程序。exitprocess是一个api函数,它会结束当前应用程序的执行,并设置退出代码,函数声明如下:void exitprocess(uint uexitcode);

8、 /参数uexitcode为此程序的退出代码 四、实验所需仪器、设备、材料(试剂)windows操作系统,microsoft visual c+6.0或.net环境,msdn帮助文档。5、 实验正文#include stdafx.h#include #include #include / 声明快照函数的头文件bool terminateprocessfromid(dword dwid)bool bret = false;/ 打开目标进程,取得进程句柄handle hprocess = :openprocess (process_all_access, false, dwid); /proces

9、s_all_access:所有权限,包括创建、读、写等。/openprocess如果成功,则该进程内核对象引用计数+1if(hprocess != null)bret = :terminateprocess(hprocess, 0);closehandle(hprocess);/结束了进程,还要使该进程内核对象引用计数-1return bret;int main(int argc, char* argv)char szcommandline = notepad ;startupinfo si = sizeof(si) ;process_information pi;si.dwflags = s

10、tartf_useshowwindow;/ 指定wshowwindow成员有效si.wshowwindow = true;/ 此成员设为true的话则显示新建进程的主窗口,/ 为false的话则不显示bool bret = :createprocess (null,/ 不在此指定可执行文件的文件名szcommandline,/ 命令行参数null,/ 默认进程安全性null,/ 默认线程安全性false,/ 指定当前进程内的句柄不可以被子进程继承create_new_console,/ 为新进程创建一个新的控制台窗口null,/ 使用本进程的环境变量null,/ 使用本进程的驱动器和目录&si

11、,&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 = :createtoolhelp32snapsho

12、t(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 nn, pe32.th32processid);bmore = :process32next(hproce

13、sssnap, &pe32);/ 不要忘记清除掉snapshot对象:closehandle(hprocesssnap);dword dwid;printf( 请输入您要终止的进程的id号: n);scanf(%u, &dwid);if(terminateprocessfromid(dwid)printf( 终止进程成功! n);elseprintf( 终止进程失败! n);return 0;运行结果:windows编程基础实验 一、实验目的 了解windows程序的结构与特点,了解windows程序中至关重要的消息机制,包括消息的定义、消息循环以及消息相应函数。熟悉基本的winapi。二、实

14、验要求 利用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 事件:是对计算机操作的动作。每个事件对应

15、一个消息,即每个事件发生的效果是产生消息。3 系统调用:表示应用程序可以通知操作系统执行某个具体的动作。4 消息:表示操作系统能够将输入设备的变化上传给应用程序。windows程序采用事件驱动模型,它不同于传统的过程驱动模型,如下图所示:消息处理事件1事件2事件3.事件n开始结束事件驱动编程模型由事件驱动模型可知,windows编程中最基础的部分的就是消息处理。下面是消息的定义:typedef struct tagmsg hwnd hwnd; /接收窗口 uint message; /消息标识 wparam wparam; /附加 lparam lparam; /附加 dword time;

16、/入队时间 point pt; /光标位置 msg; winmain是windows程序的入口函数,由操作系统来进行调用,是程序执行的起点。格式如下:intwinmain(hinstancehinstance,hinstancehprevinstance,lpstrlpcmdline,intncmdshow);参数说明如下:hinstance inhandle to the current instance of the application. hprevinstance inhandle to the previous instance of the application. this p

17、arameter is always null. if you need to detect whether another instance already exists, create a uniquely named mutex using the createmutex function. createmutex will succeed even if the mutex already exists, but the function will return error_already_exists. this indicates that another instance of

18、your application exists, because it created the mutex first. lpcmdline inpointer to a null-terminated string specifying the command line for the application, excluding the program name. to retrieve the entire command line, use the getcommandline function. ncmdshow inspecifies how the window is to be

19、 shown. this parameter can be one of the following values. sw_hide hides the window and activates another window.返回值说明:if the function succeeds, terminating when it receives a wm_quit message, it should return the exit value contained in that messages wparam parameter. if the function terminates bef

20、ore entering the message loop, it should return zero.winmain中主要完成两项最基本的工作:创建一个主窗口、完成消息循环。在创建主窗口的过程中指定了消息相应函数的地址。所以我们还需要编写一个消息相应函数。创建一个完整的窗口需要经过下面四个操作步骤: 设计一个窗口类; 注册窗口类; 创建窗口; 显示及更新窗口;消息相应函数:举例:汽车厂家生产汽车好比应用程序创建窗口,用户使用汽车好比操作系统管理窗口,某种汽车在销售前就指定好了修理站(类似回调函数),当用户的汽车出现故障后(类似窗口收到消息),汽车用户(类似操作系统)自己直接找到修理站去修理

21、,不用厂家(类似应用程序)亲自将车送到修理站去修理,但修理站还得由厂家事先建造好。 消息相应函数原形说明如下:lresult callback winsunproc(hwnd hwnd, / handle to windowuint umsg, / message identifierwparam wparam, / first message parameterlparam lparam / second message parameter)四、实验所需仪器、设备、材料(试剂)windows操作系统,microsoft visual c+6.0或.net环境,msdn帮助文档。五、 实验正文

22、#include #include stdafx.h/ 窗口函数的函数原形lresult callback mainwndproc(hwnd, uint, wparam, lparam);int apientry winmain(hinstance hinstance, hinstance hprevinstance, lpstr lpcmdline, int ncmdshow)char szclassname = mainwclass;wndclassex wndclass;/ 用描述主窗口的参数填充wndclassex结构wndclass.cbsize = sizeof(wndclass)

23、;/ 结构的大小wndclass.style = cs_hredraw|cs_vredraw;/ 指定如果大小改变就重画wndclass.lpfnwndproc = mainwndproc;/ 窗口函数指针wndclass.cbclsextra = 0;/ 没有额外的类内存wndclass.cbwndextra = 0;/ 没有额外的窗口内存wndclass.hinstance = hinstance;/ 实例句柄 wndclass.hicon = :loadicon(null, idi_application);/ 使用预定义图标wndclass.hcursor = :loadcursor(

24、null,idc_arrow);/ 使用预定义的光标wndclass.hbrbackground = (hbrush):getstockobject(white_brush);/ 使用白色背景画刷wndclass.lpszmenuname = null;/ 不指定菜单wndclass.lpszclassname = szclassname ;/ 窗口类的名称wndclass.hiconsm = null;/ 没有类的小图标/ 注册这个窗口类:registerclassex(&wndclass); / 创建主窗口hwnd hwnd = :createwindowex( 0,/ dwexstyle

25、,扩展样式szclassname,/ lpclassname,类名my first window!,/ lpwindowname,标题ws_overlappedwindow,/ dwstyle,窗口风格cw_usedefault,/ x,初始 x 坐标cw_usedefault,/ y,初始 y 坐标cw_usedefault,/ nwidth,宽度cw_usedefault,/ nheight,高度null,/ hwndparent,父窗口句柄null,/ hmenu,菜单句柄hinstance,/ hlnstance,程序实例句柄null) ;/ lpparam,用户数据if(hwnd =

26、 null):messagebox(null, 创建窗口出错!, error, mb_ok);return -1;/ 显示窗口,刷新窗口客户区:showwindow(hwnd, ncmdshow);:updatewindow(hwnd);/ 从消息堆中取出消息msg msg;while(:getmessage(&msg,null, 0, 0)/ 转化键盘消息:translatemessage(&msg);/ 将消息发送到相应的窗口函数:dispatchmessage(&msg);/ 当getmessage返回0时程序结束return msg.wparam;lresult callback ma

27、inwndproc(hwnd hwnd, uint message, wparam wparam, lparam lparam)char sztext = 最简单的窗口程序!;switch (message) case wm_paint: / 窗口客户区需要重画hdc hdc;paintstruct ps;/ 使无效的客户区变的有效,并取得设备环境句柄hdc = :beginpaint (hwnd, &ps) ;/ 显示文字:textout(hdc, 10, 10, sztext, strlen(sztext);:endpaint(hwnd, &ps);return 0;case wm_cha

28、r:char szchar20;sprintf(szchar,char is %d,wparam);messagebox(hwnd,szchar,windows,mb_ok);break;case wm_lbuttondown:messagebox(hwnd,mouse clicked,message,0);hdc hdc;hdc=getdc(hwnd);textout(hdc,0,50,windows program,strlen(windows program);releasedc(hwnd,hdc); break;case wm_close:if(idyes=messagebox(hwn

29、d,是否退出程序?,windows,mb_yesno)destroywindow(hwnd);case wm_destroy: / 正在销毁窗口/ 向消息队列投递一个wm_quit消息,促使getmessage函数返回0,结束消息循环:postquitmessage(0) ;return 0 ;/ 将我们不处理的消息交给系统做默认处理return :defwindowproc(hwnd, message, wparam, lparam);结果显示:用多线程同步方法解决哲学家就餐问题 一、实验目的 理解windows编程环境下的线程同步机制,掌握线程同步的方法,包括临界区对象、事件内核对象、互锁

30、函数等方法,并能用线程同步解决经典的线程同步问题,体会多线程编程。二、实验要求 1)为每个哲学家产生一个线程,设计正确的同步算法2)每个哲学家取得一双筷子开始用餐后,即时显示“dining”和该哲学家的自定义标识符以及餐桌上所有几位哲学家标识符及其所坐的位置。3)设定共有5个哲学家需用餐。每位用餐耗时10秒钟以上。4)多个哲学家须共享操作函数代码三、实验原理本实验设计解决的是哲学家就餐问题,共有5个哲学家绕一个圆桌做在5个位置上,他们每2个人中间有一只筷子,共5只筷子,只有当每个哲学家取得他左右两边的筷子时,哲学家才能开始就餐,其它时间,哲学家只能思考或等待筷子。为避免哲学家互相等待对方的筷子发生死锁,因此,奇数座位的哲学家按先左后右的顺序拿筷子,偶数座位的哲学家按先右后左的顺序拿筷子。本课程设计针对5只筷子分别设置了5个事件内核对象,以保证每只筷子每次只能被取得一次;针对每个哲学家,通过共享操作函数代码,分别建立5个线程,以同步哲学家就餐。四、实验所需仪器、设备、材料(试剂)windows操作系统,microsoft visual c+6.0或.net环境,msdn帮助文档。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论