Windows实验报告.docx
《Windows实验报告.docx》由会员分享,可在线阅读,更多相关《Windows实验报告.docx(22页珍藏版)》请在冰点文库上搜索。
Windows实验报告
华北电力大学
实验报告
|
|
实验名称验证性试验、设计性试验
课程名称Windows体系及编程
|
|
专业班级:
计科0803学生:
董世令
学号:
2成绩:
指导教师:
王新颖实验日期:
2011.4.8
进程管理实验
一、实验目的
理解Windows编程环境下的进程管理机制,能创建一个完成特定功能的进程,并能对进程进行信息的获取、终止和保护。
二、实验要求
1.编写一段程序,能够完成创建进程的功能,要求启动windows记事本程序(notepad.exe),同时打开一个文本文件,路径为:
c:
\system\user.log。
并打印出新建进程ID。
2.获取当前系统进程信息,打印输出进程名称和ID号。
3.终止新创建的进程并获取退出代码。
三、实验原理
(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(
HANDLEhSnapshot,//系统快照句柄
LPPROCESSENTRY32lppe//指向结构体PROCESSENTRY32的指针
);
(3)进程的终止
终止进程也就是结束进程,让进程从存中卸载。
进程的终止的原因一般有4种。
1)主线程的入口函数返回。
2)进程中的一个线程调用ExitProcess函数。
3)次进程中的所有线程结束。
4)其他进程中又有线程都结束。
要结束当前进程一般让主线程的入口函数返回。
当用户的程序入口函数返回的时候,启动函数会调用C/C++运行期退出函数EXIT,并将用户的返回值传递给它。
EXTI函数会销毁所有全局的或静态的C++对象,然后调用系统函数ExitProcess促使操作系统终止应用程序。
ExitProcess是一个API函数,它会结束当前应用程序的执行,并设置退出代码,函数声明如下:
VoidExitProcess(UINTuExitCode);//参数uExitCode为此程序的退出代码
四、实验所需仪器、设备、材料(试剂)
Windows操作系统,MicrosoftVisualc++6.0或.NET环境,msdn帮助文档。
5、实验正文
#include"stdafx.h"
#include
#include
#include//声明快照函数的头文件
BOOLTerminateProcessFromId(DWORDdwId)
{
BOOLbRet=FALSE;
//打开目标进程,取得进程句柄
HANDLEhProcess=:
:
OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwId);//PROCESS_ALL_ACCESS:
所有权限,包括创建、读、写等。
//OpenProcess如果成功,则该进程核对象引用计数+1
if(hProcess!
=NULL)
{
bRet=:
:
TerminateProcess(hProcess,0);
CloseHandle(hProcess);//结束了进程,还要使该进程核对象引用计数-1
}
returnbRet;
}
intmain(intargc,char*argv[])
{
charszCommandLine[]="notepad";
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);
printf("新进程的主线程ID号:
%d\n",pi.dwThreadId);
}
PROCESSENTRY32pe32;//在使用这个结构之前,先设置它的大小
pe32.dwSize=sizeof(pe32);//给系统的所有进程拍一个快照
HANDLEhProcessSnap=:
:
CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnap==INVALID_HANDLE_VALUE)
{printf("CreateToolhelp32Snapshot调用失败!
\n");
return-1;
}
BOOLbMore=:
:
Process32First(hProcessSnap,&pe32);//遍历快照,轮流显示每个进程的信息
while(bMore)
{printf("进程名称:
%s\n",pe32.szExeFile);
printf("进程ID号:
%u\n\n",pe32.th32ProcessID);
bMore=:
:
Process32Next(hProcessSnap,&pe32);
}
//不要忘记清除掉snapshot对象
:
:
CloseHandle(hProcessSnap);
DWORDdwId;
printf("请输入您要终止的进程的ID号:
\n");
scanf("%u",&dwId);
if(TerminateProcessFromId(dwId))
{
printf("终止进程成功!
\n");
}
else
{
printf("终止进程失败!
\n");
}
return0;
}
运行结果:
Windows编程基础实验
一、实验目的
了解windows程序的结构与特点,了解windows程序中至关重要的消息机制,包括消息的定义、消息循环以及消息相应函数。
熟悉基本的winAPI。
二、实验要求
利用WIN32API编写WinMain函数,完成窗口类的注册,窗口的创建,显示,更新,并完成消息循环过程。
利用windowsAPI实现窗口过程函数LRESULTCALLBACKWinProc(),对WM_CHAR、WM_LBUTTONDOWN、WM_PAINT、WM_CLOSE、WM_DESTROY消息进行响应,并对默认消息进行响应。
其中,对WM_PAINT的响应要完成窗口重绘,WM_CLOSE响应完成关闭窗口,WM_DESTROY完成销毁应用程序。
三、实验原理
Windows应用程序,操作系统,计算机硬件之间的相互关系
1.cpu指令
2.事件:
是对计算机操作的动作。
每个事件对应一个消息,即每个事件发生的效果是产生消息。
3.系统调用:
表示应用程序可以通知操作系统执行某个具体的动作。
4.消息:
表示操作系统能够将输入设备的变化上传给应用程序。
Windows程序采用事件驱动模型,它不同于传统的过程驱动模型,如下图所示:
由事件驱动模型可知,windows编程中最基础的部分的就是消息处理。
下面是消息的定义:
typedefstructtagMSG{
HWNDhwnd;//接收窗口
UINTmessage;//消息标识
WPARAMwParam;//附加
LPARAMlParam;//附加
DWORDtime;//入队时间
POINTpt;//光标位置
}MSG;
winmain是windows程序的入口函数,由操作系统来进行调用,是程序执行的起点。
格式如下:
int WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
);
参数说明如下:
hInstance
[in] Handletothecurrentinstanceoftheapplication.
hPrevInstance
[in] Handletothepreviousinstanceoftheapplication.ThisparameterisalwaysNULL.Ifyouneedtodetectwhetheranotherinstancealreadyexists,createauniquelynamedmutexusingtheCreateMutexfunction.CreateMutexwillsucceedevenifthemutexalreadyexists,butthefunctionwillreturnERROR_ALREADY_EXISTS.Thisindicatesthatanotherinstanceofyourapplicationexists,becauseitcreatedthemutexfirst.
lpCmdLine
[in] Pointertoanull-terminatedstringspecifyingthecommandlinefortheapplication,excludingtheprogramname.Toretrievetheentirecommandline,usetheGetCommandLinefunction.
nCmdShow
[in] Specifieshowthewindowistobeshown.Thisparametercanbeoneofthefollowingvalues.
SW_HIDE
Hidesthewindowandactivatesanotherwindow.
返回值说明:
Ifthefunctionsucceeds,terminatingwhenitreceivesaWM_QUITmessage,itshouldreturntheexitvaluecontainedinthatmessage'swParamparameter.Ifthefunctionterminatesbeforeenteringthemessageloop,itshouldreturnzero.
winmain中主要完成两项最基本的工作:
创建一个主窗口、完成消息循环。
在创建主窗口的过程中指定了消息相应函数的地址。
所以我们还需要编写一个消息相应函数。
创建一个完整的窗口需要经过下面四个操作步骤:
•设计一个窗口类;
•注册窗口类;
•创建窗口;
•显示及更新窗口;
消息相应函数:
举例:
汽车厂家生产汽车好比应用程序创建窗口,用户使用汽车好比操作系统管理窗口,某种汽车在销售前就指定好了修理站(类似回调函数),当用户的汽车出现故障后(类似窗口收到消息),汽车用户(类似操作系统)自己直接找到修理站去修理,不用厂家(类似应用程序)亲自将车送到修理站去修理,但修理站还得由厂家事先建造好。
消息相应函数原形说明如下:
LRESULTCALLBACKWinSunProc(
HWNDhwnd,//handletowindow
UINTuMsg,//messageidentifier
WPARAMwParam,//firstmessageparameter
LPARAMlParam//secondmessageparameter
)
四、实验所需仪器、设备、材料(试剂)
Windows操作系统,MicrosoftVisualc++6.0或.NET环境,msdn帮助文档。
五、实验正文
#include
#include"stdafx.h"
//窗口函数的函数原形
LRESULTCALLBACKMainWndProc(HWND,UINT,WPARAM,LPARAM);
intAPIENTRYWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPSTRlpCmdLine,
intnCmdShow)
{
charszClassName[]="MainWClass";
WNDCLASSEXwndclass;
//用描述主窗口的参数填充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);
//创建主窗口
HWNDhwnd=:
:
CreateWindowEx(
0,//dwExStyle,扩展样式
szClassName,//lpClassName,类名
"MyfirstWindow!
",//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);
//从消息堆中取出消息
MSGmsg;
while(:
:
GetMessage(&msg,NULL,0,0))
{
//转化键盘消息
:
:
TranslateMessage(&msg);
//将消息发送到相应的窗口函数
:
:
DispatchMessage(&msg);
}
//当GetMessage返回0时程序结束
returnmsg.wParam;
}
LRESULTCALLBACKMainWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)
{
charszText[]="最简单的窗口程序!
";
switch(message)
{
caseWM_PAINT:
//窗口客户区需要重画
{
HDChdc;
PAINTSTRUCTps;
//使无效的客户区变的有效,并取得设备环境句柄
hdc=:
:
BeginPaint(hwnd,&ps);
//显示文字
:
:
TextOut(hdc,10,10,szText,strlen(szText));
:
:
EndPaint(hwnd,&ps);
return0;
}
caseWM_CHAR:
{
charszChar[20];
sprintf(szChar,"charis%d",wParam);
MessageBox(hwnd,szChar,"Windows",MB_OK);
break;
}
caseWM_LBUTTONDOWN:
{
MessageBox(hwnd,"mouseclicked","message",0);
HDChdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,50,"Windowsprogram",strlen("Windowsprogram"));
ReleaseDC(hwnd,hdc);
break;
}
caseWM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否退出程序?
","Windows",MB_YESNO))
{
DestroyWindow(hwnd);
}
caseWM_DESTROY:
//正在销毁窗口
//向消息队列投递一个WM_QUIT消息,促使GetMessage函数返回0,结束消息循环
:
:
PostQuitMessage(0);
return0;
}
//将我们不处理的消息交给系统做默认处理
return:
:
DefWindowProc(hwnd,message,wParam,lParam);
}
结果显示:
用多线程同步方法解决哲学家就餐问题
一、实验目的
理解Windows编程环境下的线程同步机制,掌握线程同步的方法,包括临界