Windows下的进程管理和监控器分解

上传人:仙*** 文档编号:125435731 上传时间:2022-07-26 格式:DOC 页数:35 大小:1.59MB
收藏 版权申诉 举报 下载
Windows下的进程管理和监控器分解_第1页
第1页 / 共35页
Windows下的进程管理和监控器分解_第2页
第2页 / 共35页
Windows下的进程管理和监控器分解_第3页
第3页 / 共35页
资源描述:

《Windows下的进程管理和监控器分解》由会员分享,可在线阅读,更多相关《Windows下的进程管理和监控器分解(35页珍藏版)》请在装配图网上搜索。

1、操作系统安全课程设计报告Windows下的进程管理和监控器 目录操作系统安全课程设计报告0一、概述21设计主要完成的任务22解决的主要问题2二、设计的基本概念和原理21.概念22.原理2三、总体设计31.功能模块32.流程图3四、详细设计4主要功能的代码实现:4五、完成的情况以及使用说明22六、总结33七、参考文献33一、概述1设计主要完成的任务设计一个Windows或Linux下的进程管理与监控程序,要求该程序完成以下功能:(1)可获取当前正在运行的所有进程,包括进程PID、进程名称、CPU使用情况、当前用户名、内存占用量等;(2)能进一步获取各进程的所有线程情况;(3)能通过命令终止某个进

2、程的执行,终止时能将其子孙进程全部终止;(4)要求界面友好。2解决的主要问题我们的电脑需要我们去了解它的运行状况,掌握和管理它的进程,并对其异常情况给予操作和控制,任务管理器就像是我们了解和控制自己电脑运作的一个窗口,通过这个窗口我们可以了解到电脑所有进程运行状况,并对运行的进程加于管理和控制。本管理器设计比较简洁,操作灵活,使用简单,可以为我们管理和控制计算机的进程提供了一个简便的方法,是我们控制本计算机进程和了解计算机进程情况的良好助手。二、设计的基本概念和原理1.概念在本实验中,启动进程管理器后,可以通过”获取进程”功能来获得本计算机启动的进程,以及与该进程相关的信息,其中包括的信息有:

3、进程映像名称,进程开启的线程数,进程的PID以及进程的优先数,我们可以通过这些信息来了解计算机中每个进程的使用状况。同时我们可以在进程管理器上选中一个要终止的的进程,点击“终止进程”功能按钮,该进程被终止执行并退出进程列表,其中还包括了自动刷新的功能,此按钮实现的功能正如我们电脑任务管理器的“进程”功能,当电脑执行程序不能通过关闭窗口进行正常的关闭时,可以借助此办法来关闭进程。我们还可以通过这个进程管理器来启动新的进程,当我们要在进程管理器里启动新的进程时,只要点击“启动新进程”按键,则会弹出“打开进程”对话框,我们可以通过对话框里的“浏览”窗口选择要打开的新进程,这是任务管理器里没有实现的功

4、能,通过这个功能我们在管理计算机时变得更加灵活方便,也使进程管理的功能更加完善。在退出此进程管理器时候,只要选择“退出”功能按钮则可关闭进程管理器,快速退出管理器的界面。2.原理 在VisualStudio环境设计一个基于对话框的应用程序,类似于Windows自带的任务管理器,主窗口上添加一个标签控件,加入四个页面,分别是:窗口信息、进程,服务和性能。 其中,窗口信息显示当前正在运行的任务,用列表控件进行显示,并能够对任务进行操作,如:添加新任务,结束任务,切换任务等。进程页面显示当前系统正在运行的进程及相关的模块,线程等,用列表控件进行显示,并能够实行终止进程、进程列表保存到文件等操作。 性

5、能页面显示物理内存、虚拟内存和页文件等详细使用情况,CPU、内存的使用率,并绘制CPU使用率和内存使用率的图形,并用列表控件显示系统当前信息。三、总体设计1.功能模块进程、线程状态新建、切换进程、关闭进程关于总在最前新建任务、退出管理器进程帮助选项文件功能设计内存使用状态CPU状态进程数实时状态监控Windows任务管理器性能关机、注销关机2.流程图四、详细设计主要功能的代码实现:获得进程代码实现Public Sub ListProcess()On Error Resume Next Dim i As Long, j As Long, n As Long Dim proc As PROCESS

6、ENTRY32 Dim snap As Long Dim exename As String 应用程序名 Dim item As ListItem Dim lngHwndProcess As Long Dim lngModules(1 To 200) As Long Dim lngCBSize2 As Long Dim lngReturn As Long Dim strModuleName As String Dim pmc As PROCESS_MEMORY_COUNTERS Dim WKSize As Long Dim strProcessName As String Dim strCom

7、ment As String 装载进程注释的字符串 Dim ProClass As String 程序的类名 开始进程循环snap = CreateToolhelpSnapshot(TH32CS_SNAPall, 0) proc.dwSize = Len(proc)theloop = ProcessFirst(snap, proc) i = 0 n = 0 While theloop 0 i = i + 1 打开指定的进程序,并得到进程的句柄lngHwndProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0,

8、 proc.th32ProcessID) If lngHwndProcess 0 Then 枚举系统中正在运行的进程模板lngReturn = EnumProcessModules(lngHwndProcess, lngModules(1), 200, lngCBSize2) If lngReturn 0 Then 返回特定数目空格的strModuleName = Space(MAX_PATH) 获取一个已装载模板的完整路径名称lngReturn = GetModuleFileNameExA(lngHwndProcess, lngModules(1), strModuleName, 500)s

9、trProcessName = Left(strModuleName, lngReturn)strProcessName = CheckPath(Trim$(strProcessName) If strProcessName Then 判断ITEM是否已经存在 j = HaveItem(proc.th32ProcessID) If j = 0 Then 如果没有该进程 获取短文件名exename = Dir(strProcessName, vbNormal Or vbHidden Or vbReadOnly Or vbSystem) If exename = hh.exe Then MsgBo

10、x SetProClass(proc.th32ProcessID, IDLE_PRIORITY_CLASS) End If 添加进程item Set item = List1.ListItems.Add(, ID: & CStr(proc.th32ProcessID), exename) 进程IDitem.SubItems(1) = proc.th32ProcessID 内存使用 pmc.cb = LenB(pmc) 获得进程的内存信息,在这里就是计算该进程占用内存多少lret = GetProcessMemoryInfo(lngHwndProcess, pmc, pmc.cb) n = n

11、+ pmc.WorkingSetSize WKSize = pmc.WorkingSetSize / 1024item.SubItems(3) = WKSize & K 进程序IP号item.SubItems(2) = GetProClass(proc.th32ProcessID) 进程图标将获取的图标加到IMAGE控件中IM1.ListImages.Add , strProcessName, GetIcon(strProcessName) item.SmallIcon = IM1.ListImages.item(strProcessName).Key Else 如果已经有该进程 pmc.cb

12、 = LenB(pmc) 获得进程的内存信息,在这里就是计算该进程占用内存多少lret = GetProcessMemoryInfo(lngHwndProcess, pmc, pmc.cb) n = n + pmc.WorkingSetSize WKSize = pmc.WorkingSetSize / 1024 计算占用内存 If CLng(List1.ListItems.item(j).SubItems(3) WKSize Then List1.ListItems.item(j).SubItems(3) = WKSize & K 获得进程的类名 ProClass = GetProClass

13、(proc.th32ProcessID) If ProClass List1.ListItems.item(j).SubItems(5) Then List1.ListItems.item(j).SubItems(5) = ProClass End If End If End If End Iftheloop = ProcessNext(snap, proc) Wend CloseHandle snap 显示总进程数 Label3 If i ProCount Then Label3.Caption = 进程数: & i ProCount = i End If If n RamUse Then

14、这里的130是后来加上去的.是为了和系统自带的数值一样 Label5.Caption = Val(FormatLng(n) + 130 & MB RamUse = n For i = 950 To Val(FormatLng(n) + 400 Step -90 rampic.Line (0, i)-Step(1200, 20), &HFF00&, BF Next i End IfEnd Sub调用系统的关于窗Private Sub about_Click()On Error Resume Next ShellAbout Me.hwnd, App.Title, 谭建&文程&张源, ByVal 0

15、&End Sub退出本程序员Private Sub close_Click() tmrRefresh.Enabled = False Unload MeEnd SubPrivate Sub CloseSystem_Click() tmrRefresh.Enabled = False Unload MeEnd Sub应用程序切换程序Private Sub cmdSwitch_Click() Dim hwnd As Long Dim X As Long Dim lngWW As Long If LstApp.ListIndex 0 Then Beep: Exit Subhwnd = LstApp.

16、ItemData(LstApp.ListIndex) 取得窗口的结构信息lngWW = GetWindowLong(hwnd, GWL_STYLE) If lngWW And WS_MINIMIZE Then控制窗口的可见性 X = ShowWindow(hwnd, SW_RESTORE) End If 指定一个窗口新的位置 第2个参数:将窗口置于Z序列的顶部. X = SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, _ SWP_NOMOVE Or SWP_NOSIZE Or SWP_SHOWWINDOW)End Sub 保持当前位置或保持当前大小或显示窗口弹

17、出新建任务窗Private Sub Command1_Click()frmnew.Show vbModalEnd Sub结束应用程序还有就是在如果列表中没有活动程序,点击结束程序会退出本身Private Sub Command3_Click() On Error Resume Next If LstApp.ListCount = 0 Then 应用程序的类名,和程序的标题 Dim lpclassname As String, lpcaption As String 程序的句柄号 Dim Handle As Long Dim Retval As Long 先是打开要关闭的程序,其它就是将该程序显

18、示成当前程序 Shell LstApp.Text, 1lpclassname = LstApp.Textlpcaption = LstApp.Text 获得程序的句柄号 Handle = FindWindow(vbNullString, lpcaption) 用函数关闭应用程序 PostMessage Handle, WM_Close, 0&, 0& 所了和列表控件一至,在这里删除列表中的该进程名 LstApp.RemoveItem LstApp.ListIndex LstApp.refresh 刷新 FindAllAppsEnd Sub结束指定进程功能代码实现Private Sub Comm

19、and4_Click()On Error Resume Next Dim i As Long, hand As Long, id As Long If MsgBox(确定要结束进程 & List1.SelectedItem.Text & 吗?, vbExclamation + vbOKCancel) = vbCancel Then Exit Subid = CLng(List1.SelectedItem.SubItems(1) If id 0 Then EndPro id End If ListProcessEnd SubPrivate Sub Command5_Click() Dim Abo

20、utRet As Long AboutRet = ExitWindowsEx(EWX_LOGOFF, 0)End Sub注销用户功能实现Private Sub Command6_Click() Dim AboutRet As Long AboutRet = ExitWindowsEx(EWX_LOGOFF, 0)End Sub切换至功能实现Private Sub cutoverto_Click() cmdSwitch_Click Me.WindowState = 1End Sub 改变进程显示方式Private Sub Detailed_Click() List1.View = lvwRepo

21、rtEnd Sub结束应用程序功能实现Private Sub endprograme_Click() Command3_ClickEnd Sub 关机功能实现Private Sub Exit_Click()frmclose.Show vbModalEnd SubCPU效率监视CpuPicture(0).ScaleMode = vbPixelsCpuPicture(1).ScaleMode = vbPixels Set QueryObject = New CCpuwatch对象初始化 QueryObject.Initialize打开时间控件 tmrRefresh.Enabled = True调用

22、刷新过程 tmrRefresh_Timer*获得所有系统进程 ListProcess 窗体总在前 SetTop Me, front.Checked*获得系统的当前用户cnt& = 199s$ = String$(200, 0)dl& = GetUserName(s$, cnt) Set item = ListView3.ListItems.Add(, , s$, , 2) item.SubItems(2) = 正在运行.item.SubItems(1) = WorkstationID 设置系统托盘 If WindowState = vbMinimized Then LastState = vb

23、Normal Else LastState = WindowState End If AddToTray Me, TrayEnd SubPrivate Sub Form_Resize() Select Case WindowState Case vbMinimized Me.Visible = False Case vbMaximized Me.Visible = True End Select If WindowState vbMinimized Then LastState = WindowState Me.Visible = True End IfEnd SubPrivate Sub F

24、orm_Unload(Cancel As Integer) RemoveFromTray 关闭托盘 tmrRefresh.Enabled = False Unload MeEnd SubPrivate Sub front_Click() front.Checked = Not front.Checked SetTop Me, front.CheckedEnd SubPrivate Sub jsjc_Click() Command4_ClickEnd SubPrivate Sub List1_ColumnClick(ByVal ColumnHeader As MSComctlLib.Column

25、Header)On Error Resume Next With List1 设置 Sorted 为 True 以将列表排序。 If (ColumnHeader.Index - 1) = .SortKey Then .SortOrder = (.SortOrder + 1) Mod 2 .Sorted = True Else .Sorted = False .SortOrder = 0 .SortKey = ColumnHeader.Index - 1 .Sorted = True End If End WithEnd Sub右击菜单;,并初使化进程的优先级别Private Sub List1

26、_MouseDown(Button As Integer, Shift As Integer, X As Single, y As Single)On Error Resume Next Dim j As Long, i As Long If Button = 2 Then If List1.HitTest(X, y) Is Nothing Then Exit Sub j = List1.HitTest(X, y).IndexList1.ListItems(j).Selected = True For i = 0 To 5mnuSetProClassSub(i).Checked = False

27、 Next Select Case List1.SelectedItem.SubItems(2) Case 实时: mnuSetProClassSub(0).Checked = True Case 高: mnuSetProClassSub(1).Checked = True Case 较高: mnuSetProClassSub(2).Checked = True Case 标准: mnuSetProClassSub(3).Checked = True Case 较低: mnuSetProClassSub(4).Checked = True Case 低: mnuSetProClassSub(5

28、).Checked = True End Select PopupMenu you End IfEnd SubPrivate Sub log_Click()frmclose.Show vbModalEnd Sub双击切换到另一个程序Sub lstApp_DblClick() cmdSwitch.Value = TrueEnd Sub任务窗Function TaskWindow(hwCurr As Long) As Long Dim lngStyle As Long 调用函数得到指定窗口的信息第一个参数是指定窗口的句柄,第二个是窗口的样式lngStyle = GetWindowLong(hwCu

29、rr, GWL_STYLE) If (lngStyle And IsTask) = IsTask Then TaskWindow = TrueEnd Function设置进程优先级Public Function SetProClass(ByVal PID As Long, ByVal ClassID As Long)On Error Resume Next Dim hwd As Long 在这里得到一个句柄hwd = OpenProcess(PROCESS_SET_INFORMATION, 0, PID) 调用这个函数设置进程的优先级 SetProClass = SetPriorityClas

30、s(hwd, ClassID)End Function右键菜单Private Sub LstApp_MouseDown(Button As Integer, Shift As Integer, X As Single, y As Single) If Button = 2 Then PopupMenu Application End IfEnd Sub在这里设置进程优先级Private Sub mnuSetProClassSub_Click(Index As Integer)On Error Resume Next Dim PID As Long, rtn As Long PID = CLng

31、(List1.SelectedItem.SubItems(1) 得到进程PID If mnuSetProClassSub(Index).Checked = True Then Exit Sub Select Case Index Case 1: rtn = SetProClass(PID, HIGH_PRIORITY_CLASS) 高 Case 2: rtn = SetProClass(PID, 32768) 较高 Case 3: rtn = SetProClass(PID, NORMAL_PRIORITY_CLASS) 标准 Case 4: rtn = SetProClass(PID, 16

32、384) 较低 Case 5: rtn = SetProClass(PID, IDLE_PRIORITY_CLASS) 低 End Select If rtn = 0 Then MsgBox 无法为进程 & List1.SelectedItem.Text & 设置优先级。, vbCriticalEnd Sub弹出新建任务窗Private Sub newfile_Click()frmnew.Show vbModalEnd SubPrivate Sub plaseago_Click() cmdSwitch_ClickEnd SubPrivate Sub refresh_Click()frmclos

33、e.Show vbModalEnd Sub刷新Private Sub refresh1_Click() FindAllAppsEnd SubPrivate Sub showago_Click() showago.Checked = Not showago.Checked SetTop Me, showago.CheckedEnd SubPrivate Sub small_Click() List1.View = Index + 2 List1.Sorted = TrueEnd SubPrivate Sub SSTab1_DblClick()End SubPrivate Sub Timer3_T

34、imer() Dim X As Long Call GlobalMemoryStatus(minfo) 总的内存量 X = -minfo.dwTotalPhys / 1024Label2(0).Caption = Str$(Int(X) 可用的内存量 X = minfo.dwAvailPhys / 1024Label2(1).Caption = Str$(Int(X) 系统缓存Label2(2).Caption = -(Val(Label2(0) - Val(Label2(1) - 500) 虚拟内存总数 X = minfo.dwTotalVirtual / 1024Label7(0).Cap

35、tion = Str$(Int(X / 1024) & M 可用虚拟内存 X = minfo.dwAvailVirtual / 1024Label7(1).Caption = Str$(Int(X / 1024) & MEnd SubPrivate Sub Timer4_Timer() Line14.X2 = Line14.X2 - 20 Line14.X1 = Line14.X1 - 20 If Line14.X1 = 0 Then Timer4.Enabled = False Else Timer4.Enabled = True End IfEnd SubPrivate Sub Timer

36、6_Timer() FindAllAppsEnd SubCPU效率监视Private Sub tmrRefresh_Timer() Dim Ret As Integer Dim cnt As Integer Dim i As Integer 返回CPU状态 Ret = QueryObject.Querycnt = Int(Ret / 10 + 1) CpuPicture(0).Cls 清除窗口中的内容 If Ret -1 Then For i = 0 To cnt - 1 用PIC控件的LINE方法在PIC上画图,用以显示CPU的占用率CpuPicture(0).Line (2, 70 - (

37、5 + i * 6)-(79, 70 - (5 + i * 6 + 2), &HFF00&, BF Next i ShiftPointsGraphPoints(UBound(GraphPoints) = RetCpuPicture(1).Cls For cnt = LBound(GraphPoints) To UBound(GraphPoints) - 1CpuPicture(1).Line (cnt, 80 - GraphPoints(cnt)-(cnt + 1, 80 - GraphPoints(cnt + 1), &HFF00& Next cnt CpuLabel.Caption = C

38、Str(Ret) + % Label4.Caption = CPU 使用: &CStr(Ret) + % 托盘显示CPU使用率 SetTrayTip CPU 使用: &CStr(Ret) + %End IfEnd SubCPU效率监视Sub ShiftPoints() Dim cnt As Integer For cnt = LBound(GraphPoints) To UBound(GraphPoints) - 1GraphPoints(cnt) = GraphPoints(cnt + 1) Next cntEnd Sub判断item是否存在Public Function HaveItem(

39、ByVal itemID As Long) As LongOn Error GoTo zbb HaveItem = List1.ListItems(ID: & CStr(itemID).IndexExit Functionzbb: HaveItem = 0End Function结束一个进程Public Sub EndPro(ByVal PID As Long)On Error Resume Next Dim lngHwndProcess As Long Dim hand As Long Dim exitCode As Long 打开要结束的进程,把该进程的句柄赋给变量hand = OpenP

40、rocess(PROCESS_TERMINATE, True, PID) 结束进程 TerminateProcess hand, exitCode 关闭进程的内核对象.(除非对内核对象的所有引用都已关闭,否则该对象不会实际删除) CloseHandle handEnd SubPrivate Sub Timer2_Timer() CheckProcessEnd SubPrivate Sub Timer1_Timer() ListProcessEnd Sub将正在运行的应用程序加到列表控件中Sub FindAllApps() Dim hwCurr As Long Dim intLen As Lon

41、g Dim strTitle As String Dim item As ListItem 先清空 LstApp.Clear 获取一个窗口的句柄 为一个源子窗口寻找第一个兄弟(同级)窗口,或寻找第一个顶级窗口hwCurr = GetWindow(Me.hwnd, GW_HWNDFIRST) Do While hwCurr If hwCurr Me.hwnd And TaskWindow(hwCurr) Then 调查窗口标题文字或控件内容的长短intLen = GetWindowTextLength(hwCurr) + 1strTitle = Space$(intLen) 取得窗体的标题(ca

42、ption)文字intLen = GetWindowText(hwCurr, strTitle, intLen) If intLen 0 Then LstApp.AddItem strTitle Set item = LstApp.ListItems.Add(, , strTitle, 3)LstApp.ItemData(LstApp.NewIndex) = hwCurr End If End If 获取下一个窗口的句柄hwCurr = GetWindow(hwCurr, GW_HWNDNEXT) LoopEnd SubPublic Function CheckPath(ByVal PathS

43、tr As String) As StringOn Error Resume Next 返回一个字符串,该字符串中指定的子字符串已被替换成另一子字符串,并且替换发生的次数也是指定的。 PathStr = Replace(PathStr, ?, ) If UCase(Left$(PathStr, 12) = SYSTEMROOT Then PathStr = GetWinDir & Mid$(PathStr, 12) CheckPath = PathStrEnd Function新建一个进程的命令 OpenProcess函数声明Private Declare Function OpenProce

44、ss Lib kernel32 _(ByVal dwDesiredAccess As Long, _ByVal bInheritHandle As Long, _ByVal dwProcessId As Long _) As Long CloseHandle函数声明Private Declare Function CloseHandle Lib kernel32 _(ByVal hObject As Long) As LongPrivate Sub close_Click() Unload MeEnd SubPrivate Sub cmdnew_Click() cmdialog.DialogT

45、itle = 浏览 cmdialog.Filter = 程序|*.exe|所有文件|*.* cmdialog.ShowOpen Combo1.Text = cmdialog.FileNameEnd SubPrivate Sub cmdOK_Click()On Error GoTo err Dim hProgram As Long 被检测的程序进程句柄 Dim X 打开指定的程序 X = Shell(Combo1.Text, 1)hProgram = OpenProcess(0, False, X) CloseHandle hProgram Exit Sub Unload Meerr: MsgB

46、ox Windows 找不到文件 & Combo1.Text & 。请确定文件名是否正确后,再试一次。要搜索文件,请单击开始按钮,然 & Chr(13) & Chr(10) & 后单击“搜索”。, vbExclamation, Combo1.Text Combo1.SetFocus Combo1.SelStart = 0 Combo1.SelLength = Len(Combo1.Text)End SubPrivate Sub Combo1_Change() If Combo1.Text = Then cmdOK.Enabled = False Else cmdOK.Enabled = Tru

47、e End IfEnd SubPrivate Sub Form_Load() SetTop Me, TrueEnd Sub五、完成的情况以及使用说明与系统的任务管理器对比:新建任务:六、总结课题研究设计的进程管理器能够显示任务信息,显示进程、线程模块等信息,能够结束任务、终止进程,并能以图表的形式显示CPU使用率,以数据的形式显示内存使用情况,操作简单,能基本满足用户对Windows进程管理的需求。但有些进程管理的高级功能还未在设计之中,如对进程模块(DLL文件)的卸载与加载、对异常进程的警告等,今后还需进一步学习和了解Windows核心编程,熟悉动态链接库DLL的操作等知识。通过课题的研究,

48、得出一个重要结论:在VC环境进行Windows系统编程,不仅需要熟悉VC编程环境,还需要熟悉和利用系统提供给我们的许多编程接口,即API编程,这样能大大地提高编程效率。在课题的设计过程中,任务信息、进程信息和系统资源使用情况都是利用API函数而取得的。通过课题的设计,巩固了以前所学的基本知识,更学到了软件设计的基本方法、技巧和流程,这对以后的学习工作有很大的帮助。经过一个星期的课程设计,我从一个从未接触过MFC的新手到现在对MFC有了一定程度的了解,在此期间,我上网查阅了相关的资料,看网上视频教程和查阅图书馆的相关书籍,并在一些同学的帮助下,终于完成了这份粗糙的作品。通过这次课程设计中,我学到

49、了很多关于MFC的只是,同时也对VC+有了更深的认识,并对编程有了新的看法。当然,在此过程中我也遇到了很多问题,有的问题经过研究科最终被解决了,有的问题却仍然存在,以下是我做这个实验遇到的问题,以及一些解决的方法:第一、通过本次试验,在“启动新进程”的实现函数里调用了MultiByteToWideChar,表示把多字节字符转为宽字节字符,它跟WideCharToMultiByte()函数(宽字节字符转为多字节字符)极容易混淆,实际上MultiByteToWideChar和WideCharToMultiByte是互逆的过程,MultiByteToWideChar是将普通字符串转化为Unicod,

50、而WideCharToMultiByte正好相反。它们的操作过程相类似,在使用时首先要申请数组空间,然后分配响应的数组空间,接着是进行字符间的转换了,最后还要释放所占用的内存 。这两个函数的缺点在于无法动态分配内存,在转换很长的字符串时可能会浪费较多内存空间,优点是在不考虑浪费空间的情况下转换较短字符串非常方便。第二、在窗体界面美化方面。窗体的美化方法有很多,可以在PushButton控件中美化,可以在GroupButton控件中美化,可以在Edit控件中美化,在Static控件中美化等等,本系统是在PushButton控件中美化的,自定义一个基于Cbutton的子类 CSXButton,在CSXButton函数里对整个BUTTON控件进行绘制。此次课程设计由于时间和技术的问题,有很多地方还做得不够好,存在很多不足,有很地方还需要改进,在程序的设计方面。因为对MFC和VC+编程不太熟悉,在做设计的过程中遇到了很多问题,耗费了很多时间在代码的修改和调试上,还有很多界面的设置不能如愿实现,今后应在程序的编写上下苦功,不断加强自己的编程的能力。七、参考文献计算机操作系统教程(第4版) 清华大学出版社 张尧学等操作系统安全武汉大学出版社 贾春福、郑鹏操作系统课程设计机械工业出版社 罗宇等34

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!