windows体系编程_第1页
windows体系编程_第2页
windows体系编程_第3页
windows体系编程_第4页
windows体系编程_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、科 技 学 院课程设计(综合实验)报告( 2015- 2016年度第 2 学期)名 称: Windows体系编程 题 目: 课内综合实验 院 系: 信息工程系 班 级: 学 号: 学生姓名: 指导教师: 实验学时: 成 绩: 日期: 2016 年 6 月 6 日实验一 类Windows进程任务管理器实验一、实验目的 理解Windows编程环境下的进程管理机制,能创建一个完成特定功能的进程,并能对进程进行信息的获取、终止和保护,实现一个类Windows的进程任务管理器二、实验要求 程序可为控制台或带界面应用程序,要求有较好的用户体验,完成功能:1. 能够完成创建进程的功能,打印输出新建进程ID。

2、2. 获取当前系统进程信息,列出可选显示进程信息项,根据选择显示输出进程信息。3. 终止任意进程并获取退出代码。4. 具体实现技术不限三、实验原理(1)进程的创建进程的创建通过CreateProcess()函数来实现,CreateProcess()通过创建一个新的进程及在其地址空间内运行的主线程来启动并运行一个新的程序。具体地,在执行CreateProcess()函数时,首先由操作系统负责创建一个进程内核对象,初始化计数为1,并立即为新进程创建一块虚拟地址空间。随后将可执行文件或其他任何必要的动态链接库文件的代码和数据装载到该地址空间中。在创建主线程时,也是首先由系统负责创建一个线程内核对象,

3、并初始化为1。最后启动主线程并执行进程的入口函数WinMain(),完成对进程和执行线程的创建。CreateProcess()函数的原型声明如下:BOOL CreateProcess(LPCTSTR lpApplicationName, / 可执行模块名LPTSTR lpCommandLine, / 命令行字符串LPSECURITY_ATTRIBUTES lpProcessAttributes, / 进程的安全属性 LPSECURITY_ATTRIBUTES lpThreadAttributes, / 线程的安全属性 BOOL bInheritHandles, / 句柄继承标志 DWORD d

4、wCreationFlags, / 创建标志 LPVOID lpEnvironment, / 指向新的环境块的指针 LPCTSTR lpCurrentDirectory, / 指向当前目录名的指针 LPSTARTUPINFO lpStartupInfo, / 指向启动信息结构的指针 LPPROCESS_INFORMATION lpProcessInformation / 指向进程信息结构的指针 );(2)进程的获取进程的定义是为执行程序指令的线程而保留的一系列资源的集合。进程是一个可执行的程序,由私有虚拟地址空间、代码、数据和其他操作系统资源(如进程创建的文件、管道、同步对象等)组成。进程是一

5、些所有权的集合,一个进程拥有内存、CPU运行时间等一系列资源,为线程的运行提供一个环境,每个进程都有它自己的地址空间和动态分配的内存、线程、文件和其他一些模块。系统快照的获取可以通过Win32 API函数CreateToolhelp32Snapshot()来完成,通过该函数不仅可以获取进程的快照,同样可以获取堆、模块和线程的系统快照。函数的声明如下:HANDLE WINAPI CreateToolhelp32Snapshot(DWORD dwFlags, /指定要创建包含哪一类系统信息的快照函数DWORD th32ProcessID /指定进程的ID号,当设定为0时表示指定当前进程);一旦系统

6、得到系统快照句柄,就可以对当前的标识号进行枚举,进程号通过函数Process32First()和Procee32Next()得到,这两个函数可以用于获取系统快照中第一个和下一个系统的信息,这两个函数的声明如下:BOOL WINAPI Process32First(HANDLE hSnapshot, / 系统快照句柄LPPROCESSENTRY32 lppe / 指向结构体PROCESSENTRY32的指针);BOOL WINAPI Process32Next(HANDLE hSnapshot, / 系统快照句柄LPPROCESSENTRY32 lppe / 指向结构体PROCESSENTRY3

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

8、oid ExitProcess(UINT uExitCode); /参数uExitCode为此程序的退出代码 四、实验所需仪器、设备、材料(试剂)Windows操作系统,Microsoft Visual c+6.0或.NET环境,msdn帮助文档。五、实验正文/ 02CreateProcess.cpp文件/#include "stdafx.h"#include <windows.h>#include <stdio.h>#include <tlhelp32.h> / 声明快照函数的头文件int CreateProcess()char szC

9、ommandLine = "notepad c:user.log"STARTUPINFO si = sizeof(si) ;/si.cb 赋值为 sizeof(si),该结构其余字段则全部初始化为零PROCESS_INFORMATION pi;/指向进程信息结构的指针 si.dwFlags = STARTF_USESHOWWINDOW;/ 指定wShowWindow成员有效si.wShowWindow = TRUE;/ 此成员设为TRUE的话则显示新建进程的主窗口,/ 为FALSE的话则不显示BOOL bRet = :CreateProcess (NUL

10、L,/ 不在此指定可执行文件的文件名szCommandLine,/ 命令行参数NULL,/ 默认进程安全性NULL,/ 默认线程安全性FALSE,/ 指定当前进程内的句柄不可以被子进程继承CREATE_NEW_CONSOLE,/ 为新进程创建一个新的控制台窗口NULL,/ 使用本进程的环境变量NULL,/ 使用本进程的驱动器和目录&si,&pi);if(bRet)/ 既然我们不使用两个句柄,最好是立刻将它们关闭:CloseHandle (pi.hThread);:CloseHandle (pi.hProcess);printf(" 新进程的进程ID号:%d n&quo

11、t;, pi.dwProcessId);新进程句柄printf(" 新进程的主线程ID号:%d n", pi.dwThreadId);返回全局变量标识符return 0;int ListProcess()PROCESSENTRY32 pe32;/ 在使用这个结构之前,先设置它的大小pe32.dwSize = sizeof(pe32); / 给系统内的所有进程拍一个快照HANDLE hProcessSnap = :CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if(hProcessSnap = INVALID_HANDLE_V

12、ALUE)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(hProcessSnap, &pe32);/

13、 不要忘记清除掉snapshot对象:CloseHandle(hProcessSnap);return 0;BOOL TerminateProcessFromId(DWORD dwId)/shanchujinchengBOOL bRet = FALSE;/ 打开目标进程,取得进程句柄HANDLE hProcess = :OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwId);if(hProcess != NULL)/ 终止进程/GetExitCodeProcess(hProcess, &ExitCode); bRet = :TerminateProce

14、ss(hProcess, 0);CloseHandle(hProcess);return bRet;int TiminateProcess()DWORD dwId;printf(" 请输入您要终止的进程的ID号: n");scanf("%u", &dwId);if(TerminateProcessFromId(dwId)printf(" 终止进程成功! n");elseprintf(" 终止进程失败! n");return 0;int main(int argc, char* argv)int choice

15、;/while(1)printf("请选择功能:n1.新建进程n2.列出进程表n3.终止进程");scanf("%d",&choice);switch(choice)case 1:CreateProcess();break;case 2:ListProcess();break;case 3:TiminateProcess();break;return 0;运行结果:6、 实验总结 在本次实验中,首先要熟悉进程与线程的概念,之间的关系,知道一些函数的调用,虽然在编译时出现了问题,在由于忽视了注释的使用,值得高兴的是最后都解决了,运行出了结果。实验二

16、 用多线程同步方法解决哲学家就餐问题一、实验目的 理解Windows编程环境下的线程同步机制,掌握线程同步的方法,包括临界区对象、事件内核对象、互锁函数等方法,并能用线程同步解决经典的线程同步问题,体会多线程编程。二、实验要求 1. 为每个哲学家产生一个线程,设计正确的同步算法2. 每个哲学家取得一双筷子开始用餐后,即时显示“Dining”和该哲学家的自定义标识符以及餐桌上所有几位哲学家标识符及其所坐的位置。3. 设定共有5个哲学家需用餐。每位用餐耗时10秒钟以上。4. 多个哲学家须共享操作函数代码5.最好有界面展示。三、实验原理本实验设计解决的是哲学家就餐问题,共有5个哲学家绕一个圆桌做在5

17、个位置上,他们每2个人中间有一只筷子,共5只筷子,只有当每个哲学家取得他左右两边的筷子时,哲学家才能开始就餐,其它时间,哲学家只能思考或等待筷子。为避免哲学家互相等待对方的筷子发生死锁,因此,奇数座位的哲学家按先左后右的顺序拿筷子,偶数座位的哲学家按先右后左的顺序拿筷子。本课程设计针对5只筷子分别设置了5个事件内核对象,以保证每只筷子每次只能被取得一次;针对每个哲学家,通过共享操作函数代码,分别建立5个线程,以同步哲学家就餐。四、实验所需仪器、设备、材料(试剂)Windows操作系统,Microsoft Visual c+6.0或.NET环境,msdn帮助文档。五、实验正文/ 哲学家就餐.cp

18、p : Defines the entry point for the console application./#include "stdafx.h"#include <windows.h>#include <process.h>#include <iostream.h>HANDLE HChop5;CRITICAL_SECTION cs;void print(int num) :EnterCriticalSection(&cs); cout<<num<<"号哲学家"<<&q

19、uot;Dining."<<endl; :LeaveCriticalSection(&cs);UINT WINAPI ThreadProc(LPVOID Param)/线程的起始地址int number=*(int*)(Param); for(int i = 0; i < 5; i+) if(number%2=0)/number是偶数 先右后左 WaitForSingleObject(HChopnumber-1,INFINITE);/若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止。 WaitForSingleObj

20、ect(HChopnumber,INFINITE); print(number); Sleep(5*1000); SetEvent(HChopnumber-1); SetEvent(HChopnumber); else/先左后右 WaitForSingleObject(HChopnumber%5/标识一个能够支持被通知/未通知的内核对象,INFINITE);/等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止 WaitForSingleObject(HChopnumber-1,INFINITE); print(number); Sleep(5*1000); SetEve

21、nt(HChopnumber%5); SetEvent(HChopnumber-1); return 0;int main(int argc, char* argv) HANDLE H5; int *p=new int5;:InitializeCriticalSection(&cs);/临界区锁 cs指向临界区对象for(int i=0;i<5;i+) pi=i+1;/Hi=CreateThread(NULL/形态结构指针忽略为空, 0/初始堆栈默认0 1mb,ThreadProc/指向线程函数的指标, &pi/传递给ThreadProc的参数。这样主线程和从属线程就可以

22、共享数据, 0,&dwThreadId/返回线程的ID);Hi = (HANDLE)_beginthreadex(NULL/安全属性,NULL为默认安全属性, 0/线程堆栈大小和创建它的线程的相同, ThreadProc/线程调用执行的函数地址, &pi, CREATE_SUSPENDED/线程初始状态 悬挂, NULL/用来记录线程ID的地址);HChopi=CreateEvent(NULL, FALSE/自动复位变成无信号, FALSE/初始状态无信号, NULL/事件对象的名称);for(int j=0;j<5;j+)SetEvent(HChopj);/成功返回非0

23、 ResumeThread(Hj);/继续挂起线程 WaitForMultipleObjects(5/句柄的数量,H/句柄数组的指针,TRUE/等待所以信号量有效执行,INFINITE/永不超时); for(int k=0;k<5;k+)CloseHandle(Hk);CloseHandle(HChopk); :DeleteCriticalSection(&cs); return 0;运行结果:6、 实验总结 首先了解科学家就餐算法,才能有一定的逻辑观念,函数的编写才能符合逻辑观念。实验三 简易绘图器一、实验目的 该实验为综合实验,通过该实验,使学生学习使用visual c+进行

24、简单的综合功能的系统开发。巩固Windows编程的基础知识,增加学生的利用图形子环境编程的综合能力,包括界面设计能力、使用GDI,GDI+或WPF的能力等。二、实验要求 1.利用GDI,GDI+或WPF实现简单绘图器,选其中一种即可,编程环境不限。2.实现绘制线条、矩形、圆形,可改变线条或填充的颜色。三、实验原理Windows的图形子系统经历了GDI、GDI+ 和WPF三个发展阶段。1GDI传统的GDI(Graphics Device Interface,图形设备接口)是微软随Windows 1.0(1985年11月)推出的Windows基本图形子系统,用于与显卡和显示设备无关的图形界面编程,

25、支持WYSIWYG(What You See Is What You Get,所见即所得)。2GDI+新式的GDI+是随Windows XP(2001年10月)推出的GDI的改进版,增加了混色、渐变画刷、样条曲线、矩阵变换、图像处理、持久路径等新功能,GDI+也是.NET框架中Windows 3WPF随Windows Vista和.NET框架3.0(2006年11月)微软又推出了全新的Windows图形子系统WPF(Windows Presentation Foundation,视窗展示基础),它统一了桌面和浏览器等客户端应用程序的图形界面,基于DirectX和.NET框架,采用声明式XAML

26、进行界面设计,是Windows的下一代GUI显示系统。XAML(eXtensible Application Markup Language,可扩展应用程序标记语言)是一种基于XML(eXtensible Markup Language,可扩展标记语言,一种由万维网协会定义的通用数据描述语言)的用户界面标记语言,用于定义UI元素、数据绑定、事件和其他特性。四、实验所需仪器、设备、材料(试剂)Windows操作系统,Microsoft Visual c+6.0或.NET环境,msdn帮助文档。五、实验正文using System;using System.Collections.Generic;using System.ComponentModel;

温馨提示

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

评论

0/150

提交评论