Windows体系编程实验报告(华北电力大学科技学院).doc_第1页
Windows体系编程实验报告(华北电力大学科技学院).doc_第2页
Windows体系编程实验报告(华北电力大学科技学院).doc_第3页
Windows体系编程实验报告(华北电力大学科技学院).doc_第4页
Windows体系编程实验报告(华北电力大学科技学院).doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

附件3科 技 学 院课程设计(综合实验)报告( 20 - 20 年度第 学期)名 称: Windows体系编程 题 目: 课内综合实验 院 系: 信息工程系 班 级: 软件09k2 学 号: 091909020227 学生姓名: 闫雪峰 指导教师: 李刚 实验学时: 12学时 成 绩: 日期: 2012 年 5 月 19 日一、课程设计(综合实验)的目的与要求1 正文为宋体,五号字 行间距为21 11 -12 -二、设计(实验)正文1 正文为宋体,五号字 行间距为21 11 -12 -三、课程设计(综合实验)总结或结论1 正文为宋体,五号字 行间距为21 11 -12 -四、参考文献 1 作者1, 作者2. 书名. 出版单位, 版本. 出版日期附录(设计流程图、程序、表格、数据等)注:根据课程设计、综合实验的内容将标题任选其一。进程管理实验一、实验目的 理解Windows编程环境下的进程管理机制,能创建一个完成特定功能的进程,并能对进程进行信息的获取、终止和保护。二、实验要求 1. 编写一段程序,能够完成创建进程的功能,要求启动windows记事本程序(notepad.exe),同时打开一个文本文件,路径为:c:systemuser.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帮助文档。5、 实验正文/ 02CreateProcess.cpp文件/#include stdafx.h#include #include #include / 声明快照函数的头文件int CreateProcess()char szCommandLine = notepad c:user.log;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);return 0;int ListProcess()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 nn, pe32.th32ProcessID);bMore = :Process32Next(hProcessSnap, &pe32);/ 不要忘记清除掉snapshot对象:CloseHandle(hProcessSnap);return 0;BOOL TerminateProcessFromId(DWORD dwId)BOOL bRet = FALSE;/ 打开目标进程,取得进程句柄HANDLE hProcess = :OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwId);if(hProcess != NULL)/ 终止进程/GetExitCodeProcess(hProcess, &ExitCode); bRet = :TerminateProcess(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;/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;运行结果:实验二 窗口与DLL实验 实验名称:窗口与DLL实验 实验类型: 设计性实验学时: 4适用对象: 软件工程专业、网络工程专业、信息安全专业一、实验目的 了解windows窗口程序的结构与特点,了解windows程序中至关重要的消息机制,包括消息的定义、消息循环以及消息相应函数。熟悉基本的WINAPI,了解DLL的使用方法。二、实验要求 1.利用WIN32API编写WinMain函数,完成窗口类的注册,窗口的创建,显示,更新,并完成消息循环过程。2.利用windows API实现窗口过程函数LRESULT CALLBACK WinProc( ),对WM_CHAR、WM_PAINT、WM_CLOSE、WM_DESTROY消息进行响应,并对默认消息进行响应。其中,对WM_PAINT的响应要完成窗口重绘,WM_CLOSE响应完成关闭窗口,WM_DESTROY完成销毁应用程序。3.在对WM_LBUTTONDOWN消息函数中,通过调用DLL完成对该消息的响应,实现弹出显示鼠标点击位置对话框的功能。三、实验原理Winmain中主要完成两项最基本的工作:创建一个主窗口、完成消息循环。在创建主窗口的过程中指定了消息相应函数的地址。所以我们还需要编写一个消息相应函数。创建一个完整的窗口需要经过下面四个操作步骤: 设计一个窗口类; 注册窗口类; 创建窗口; 显示及更新窗口;消息相应函数:举例:汽车厂家生产汽车好比应用程序创建窗口,用户使用汽车好比操作系统管理窗口,某种汽车在销售前就指定好了修理站(类似回调函数),当用户的汽车出现故障后(类似窗口收到消息),汽车用户(类似操作系统)自己直接找到修理站去修理,不用厂家(类似应用程序)亲自将车送到修理站去修理,但修理站还得由厂家事先建造好。 消息相应函数原形说明如下:LRESULT CALLBACK WinSunProc(HWND hwnd, / handle to windowUINT uMsg, / message identifierWPARAM wParam, / first message parameterLPARAM lParam / second message parameter)DllMain是动态链接库的入口点。库的入口函数仅供os使用,windows在库装载、卸载、进程中创建和结束线程时调用DllMain,以便采取相应的动作。BOOL APIENTRY DllMain( HANDLE hModule, /本模块句柄 DWORD ul_reason_for_call, /调用的原因 LPVOID lpReserved /保留 ) switch (ul_reason_for_call)case DLL_PROCESS_ATTACH:dll加载时case DLL_THREAD_ATTACH:创建新线程时case DLL_THREAD_DETACH:新线程正常结束时case DLL_PROCESS_DETACH:dll卸载时break; return TRUE;Dll能够定义两种函数,导出函数和内部函数。导出函数可以被其他模块调用,以可以被定义这个函数的模块调用,内部函数只能被定义这个函数的模块调用。动态链接库的主要功能是向外导出函数,供进程中的其他模块使用。四、实验所需仪器、设备、材料(试剂)Windows操作系统,Microsoft Visual c+6.0或.NET环境,msdn帮助文档。五、实验预习要求、实验条件、方法及步骤 上机编程之前应熟悉课程相应的部分,实验原理及相关的数据结构。六、实验正文#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);/ 结构的大小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(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,扩展样式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 = 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 MainWndProc(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_CHAR: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(hwnd,是否退出程序?,Windows,MB_YESNO)DestroyWindow(hwnd);case WM_DESTROY: / 正在销毁窗口/ 向消息队列投递一个WM_QUIT消息,促使GetMessage函数返回0,结束消息循环:PostQuitMessage(0) ;return 0 ;/ 将我们不处理的消息交给系统做默认处理return :DefWindowProc(hwnd, message, wParam, lParam);结果显示:实验三 用多线程同步方法解决哲学家就餐问题实验名称:用多线程同步方法解决哲学家就餐问题 实验类型: 设计性实验学时: 4适用对象: 软件工程专业、网络工程专业、信息安全专业一、实验目的 理解Windows编程环境下的线程同步机制,掌握线程同步的方法,包括临界区对象、事件内核对象、互锁函数等方法,并能用线程同步解决经典的线程同步问题,体会多线程编程。二、实验要求 1)为每个哲学家产生一个线程,设计正确的同步算法2)每个哲学家取得一双筷子开始用餐后,即时显示“Dining”和该哲学家的自定义标识符以及餐桌上所有几位哲学家标识符及其所坐的位置。3)设定共有5个哲学家需用餐。每位用餐耗时10秒钟以上。4)多个哲学家须共享操作函数代码三、实验原理本实验设计解决的是哲学家就餐问题,共有5个哲学家绕一个圆桌做在5个位置上,他们每2个人中间有一只筷子,共5只筷子,只有当每个哲学家取得他左右两边的筷子时,哲学家才能开始就餐,其它时间,哲学家只能思考或等待筷子。为避免哲学家互相等待对方的筷子发生死锁,因此,奇数座位的哲学家按先左后右的顺序拿筷子,偶数座位的哲学家按先右后左的顺序拿筷子。本课程设计针对5只筷子分别设置了5个事件内核对象,以保证每只筷子每次只能被取得一次;针对每个哲学家,通过共享操作函数代码,分别建立5个线程,以同步哲学家就餐。四、实验所需仪器、设备、材料(试剂)Windows操作系统,Microsoft Visual c+6.0或.NET环境,msdn帮助文档。五、实验预习要求、实验条件、方法及步骤 上机编程之前应熟悉课程相应的部分,实验原理及相关的数据结构。6、 实验正文/ 哲学家就餐.cpp : Defines the entry point for the console application./#include stdafx.h#include #include #include HANDLE HChop5;CRITICAL_SECTION cs;void print(int num) :EnterCriticalSection(&cs); coutnum号哲学家

温馨提示

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

评论

0/150

提交评论