Windows下的进程管理和监控器分解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统安全课程设计报告Windows下的进程管理和监控器
目录
操作系统安全课程设计报告 0
一、概述 (2)
1.设计主要完成的任务 (2)
2.解决的主要问题 (2)
二、设计的基本概念和原理 (2)
1.概念 (2)
2.原理 (2)
三、总体设计 (3)
1.功能模块 (3)
2.流程图 (3)
四、详细设计 (4)
主要功能的代码实现: (4)
五、完成的情况以及使用说明 (22)
六、总结 (33)
七、参考文献 (34)
一、概述
1.设计主要完成的任务
设计一个Windows或Linux下的进程管理与监控程序,要求该程序完成以下功能:
(1)可获取当前正在运行的所有进程,包括进程PID、进程名称、CPU使用情况、当前用户名、内存占用量等;
(2)能进一步获取各进程的所有线程情况;
(3)能通过命令终止某个进程的执行,终止时能将其子孙进程全部终止;
(4)要求界面友好。
2.解决的主要问题
我们的电脑需要我们去了解它的运行状况,掌握和管理它的进程,并对其异常情况给予操作和控制,任务管理器就像是我们了解和控制自己电脑运作的一个窗口,通过这个窗口我们可以了解到电脑所有进程运行状况,并对运行的进程加于管理和控制。
本管理器设计比较简洁,操作灵活,使用简单,可以为我们管理和控制计算机的进程提供了一个简便的方法,是我们控制本计算机进程和了解计算机进程情况的良好助手。
二、设计的基本概念和原理
1.概念
在本实验中,启动进程管理器后,可以通过”获取进程”功能来获得本计算机启动的进程,以及与该进程相关的信息,其中包括的信息有:进程映像名称,进程开启的线程数,进程的PID以及进程的优先数,我们可以通过这些信息来了解计算机中每个进程的使用状况。
同时我们可以在进程管理器上选中一个要终止的的进程,点击“终止进程”功能按钮,该进程被终止执行并退出进程列表,其中还包括了自动刷新的功能,此按钮实现的功能正如我们电脑任务管理器的“进程”功能,当电脑执行程序不能通过关闭窗口进行正常的关闭时,可以借助此办法来关闭进程。
我们还可以通过这个进程管理器来启动新的进程,当我们要在进程管理器里启动新的进程时,只要点击“启动新进程”按键,则会弹出“打开进程”对话框,我们可以通过对话框里的“浏览”窗口选择要打开的新进程,这是任务管理器里没有实现的功能,通过这个功能我们在管理计算机时变得更加灵活方便,也使进程管理的功能更加完善。
在退出此进程管理器时候,只要选择“退出”功能按钮则可关闭进程管理器,快速退出管理器的界面。
2.原理
在VisualStudio环境设计一个基于对话框的应用程序,类似于Windows自带的任务管理器,主窗口上添加一个标签控件,加入四个页面,分别是:窗口信息、进程,服务和性能。
其中,窗口信息显示当前正在运行的任务,用列表控件进行显示,并能够对任务进行操作,如:添加新任务,结束任务,切换任务等。
进程页面显示当前系统正在运行的进程及相关的模块,线程等,用列表控件进行显示,并能够实行终止进程、进程列表保存到文件等操作。
性能页面显示物理内存、虚拟内存和页文件等详细使用情况,CPU、内存的使用率,并绘制CPU使用率和内存使用率的图形,并用列表控件显示系统当前信息。
三、总体设计
1.功能模块
2.流程图
四、详细设计
主要功能的代码实现:
获得进程代码实现
Public Sub ListProcess()
On Error Resume Next
Dim i As Long, j As Long, n As Long
Dim proc As PROCESSENTRY32
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 strComment 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_INFORMA TION Or PROCESS_VM_READ, 0, proc.th32ProcessID)
If lngHwndProcess <> 0 Then
'枚举系统中正在运行的进程模板
lngReturn = EnumProcessModules(lngHwndProcess, lngModules(1), 200, lngCBSize2)
If lngReturn <> 0 Then
'返回特定数目空格的
strModuleName = Space(MAX_PATH)
'获取一个已装载模板的完整路径名称
lngReturn = GetModule(lngHwndProcess, lngModules(1), strModuleName, 500) strProcessName = 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
'MsgBox SetProClass(proc.th32ProcessID,
IDLE_PRIORITY_CLASS)
End If
'添加进程item
Set item = List1.ListItems.Add(, "ID:" & CStr(proc.th32ProcessID), exename)
'进程ID
item.SubItems(1) = proc.th32ProcessID
'内存使用
pmc.cb = LenB(pmc)
'获得进程的内存信息,在这里就是计算该进程占用内存多少lret = GetProcessMemoryInfo(lngHwndProcess, pmc, pmc.cb)
n = n + pmc.WorkingSetSize
WKSize = pmc.WorkingSetSize / 1024
item.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 = 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(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 If
theloop = ProcessNext(snap, proc)
Wend
CloseHandle snap
'显示总进程数Label3
If i <> ProCount Then
Label3.Caption = "进程数:" & i
ProCount = i
End If
If n <> RamUse Then '这里的"130"是后来加上去的.是为了和系统自带的数值一样Label5.Caption = Val(FormatLng(n)) + 130 & "MB"
RamUse = n
For i = 950 To V al(FormatLng(n)) + 400 Step -90
rampic.Line (0, i)-Step(1200, 20), &HFF00&, BF
Next i
End If
End Sub
'调用系统的"关于"窗
Private Sub about_Click()
On Error Resume Next
ShellAbout Me.hwnd, App.Title, "谭建&文程&张源", ByVal 0&
End Sub
'退出本程序员
Private Sub close_Click()
tmrRefresh.Enabled = False
Unload Me
End Sub
Private Sub CloseSystem_Click()
tmrRefresh.Enabled = False
Unload Me
End Sub
'应用程序切换程序
Private Sub cmdSwitch_Click()
Dim hwnd As Long
Dim X As Long
Dim lngWW As Long
If LstApp.ListIndex < 0 Then Beep: Exit Sub
hwnd = LstApp.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 '保持当前位置或保持当前大小或显示窗口
'弹出"新建任务"窗
Private Sub Command1_Click()
frmnew.Show vbModal
End 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
'先是打开要关闭的程序,其它就是将该程序显示成当前程序
Shell LstApp.Text, 1
lpclassname = LstApp.Text
lpcaption = LstApp.Text
'获得程序的句柄号
Handle = FindWindow(vbNullString, lpcaption)
'用函数关闭应用程序
PostMessage Handle, WM_Close, 0&, 0&
'所了和列表控件一至,在这里删除列表中的该进程名
LstApp.RemoveItem LstApp.ListIndex
LstApp.refresh
'刷新
FindAllApps
End Sub
'结束指定进程功能代码实现
Private Sub Command4_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 Sub
id = CLng(List1.SelectedItem.SubItems(1))
If id <> 0 Then
EndPro id
End If
ListProcess
End Sub
Private Sub Command5_Click()
Dim AboutRet 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 = 1
End Sub
'改变进程显示方式
Private Sub Detailed_Click()
List1.View = lvwReport
End Sub
'结束应用程序功能实现
Private Sub endprograme_Click()
Command3_Click
End Sub
'关机功能实现
Private Sub Exit_Click()
frmclose.Show vbModal
End Sub
'CPU效率监视
CpuPicture(0).ScaleMode = vbPixels
CpuPicture(1).ScaleMode = vbPixels
Set QueryObject = New CCpuwatch
'对象初始化
QueryObject.Initialize
'打开时间控件
tmrRefresh.Enabled = True
'调用刷新过程
tmrRefresh_Timer
'*****************************************
'获得所有系统进程
ListProcess
'窗体总在前
SetTop Me, front.Checked
'*************************************************** '获得系统的当前用户
cnt& = 199
s$ = 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 = vbNormal
Else
LastState = WindowState
End If
AddToTray Me, Tray
End Sub
Private 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 If
End Sub
Private Sub Form_Unload(Cancel As Integer)
RemoveFromTray '关闭托盘
tmrRefresh.Enabled = False
Unload Me
End Sub
Private Sub front_Click()
front.Checked = Not front.Checked
SetTop Me, front.Checked
End Sub
Private Sub jsjc_Click()
Command4_Click
End Sub
Private Sub List1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader) 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 With
End Sub
'右击菜单;,,并初使化进程的优先级别
Private Sub List1_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).Index
List1.ListItems(j).Selected = True
For i = 0 To 5
mnuSetProClassSub(i).Checked = False
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).Checked = True
End Select
PopupMenu you
End If
End Sub
Private Sub log_Click()
frmclose.Show vbModal
End Sub
'双击切换到另一个程序
Sub lstApp_DblClick()
cmdSwitch.Value = True
End Sub
'任务窗
Function TaskWindow(hwCurr As Long) As Long
Dim lngStyle As Long
'调用函数得到指定窗口的信息'第一个参数是指定窗口的句柄,第二个是窗口的样式lngStyle = GetWindowLong(hwCurr, GWL_STYLE)
If (lngStyle And IsTask) = IsTask Then TaskWindow = True
End 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 = SetPriorityClass(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 If
End Sub
'在这里设置进程优先级
Private Sub mnuSetProClassSub_Click(Index As Integer)
On Error Resume Next
Dim PID As Long, rtn As Long
PID = CLng(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, 16384) '较低
Case 5: rtn = SetProClass(PID, IDLE_PRIORITY_CLASS) '低
End Select
If rtn = 0 Then MsgBox "无法为进程" & List1.SelectedItem.Text & " 设置优先级。
", vbCritical
End Sub
'弹出"新建任务"窗
Private Sub new()
frmnew.Show vbModal
End Sub
Private Sub plaseago_Click()
cmdSwitch_Click
End Sub
Private Sub refresh_Click()
frmclose.Show vbModal
End Sub
'刷新
Private Sub refresh1_Click()
FindAllApps
End Sub
Private Sub showago_Click()
showago.Checked = Not showago.Checked
SetTop Me, showago.Checked
End Sub
Private Sub small_Click()
List1.View = Index + 2
List1.Sorted = True
End Sub
Private Sub SSTab1_DblClick()
End Sub
Private Sub Timer3_Timer()
Dim X As Long
Call GlobalMemoryStatus(minfo)
'总的内存量
X = -minfo.dwTotalPhys / 1024
Label2(0).Caption = Str$(Int(X))
'可用的内存量
X = minfo.dwAvailPhys / 1024
Label2(1).Caption = Str$(Int(X))
'系统缓存
Label2(2).Caption = -(Val(Label2(0)) - Val(Label2(1)) - 500) '虚拟内存总数
X = minfo.dwTotalVirtual / 1024
Label7(0).Caption = Str$(Int(X / 1024)) & " M"
'可用虚拟内存
X = minfo.dwAvailVirtual / 1024
Label7(1).Caption = Str$(Int(X / 1024)) & " M"
End Sub
Private 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 If
End Sub
Private Sub Timer6_Timer()
FindAllApps
End Sub
'CPU效率监视
Private Sub tmrRefresh_Timer()
Dim Ret As Integer
Dim cnt As Integer
Dim i As Integer
'返回CPU状态
Ret = QueryObject.Query
cnt = 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 - (5 + i * 6))-(79, 70 - (5 + i * 6 + 2)), &HFF00&, BF
Next i
Shi
GraphPoints(UBound(GraphPoints)) = Ret
CpuPicture(1).Cls
For cnt = LBound(GraphPoints) To UBound(GraphPoints) - 1
CpuPicture(1).Line (cnt, 80 - GraphPoints(cnt))-(cnt + 1, 80 - GraphPoints(cnt + 1)), &HFF00& Next cnt
CpuLabel.Caption = CStr(Ret) + "%"
Label4.Caption = "CPU 使用:" &CStr(Ret) + "%"
'托盘显示CPU使用率
SetTrayTip "CPU 使用:" &CStr(Ret) + " %"
End If
End Sub
'CPU效率监视
Sub Shi()
Dim cnt As Integer
For cnt = LBound(GraphPoints) To UBound(GraphPoints) - 1
GraphPoints(cnt) = GraphPoints(cnt + 1)
Next cnt
End Sub
'判断item是否存在
Public Function HaveItem(ByVal itemID As Long) As Long
On Error GoTo zbb
HaveItem = List1.ListItems("ID:" & CStr(itemID)).Index
Exit Function
zbb:
HaveItem = 0
End 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 = OpenProcess(PROCESS_TERMINATE, True, PID)
'结束进程
TerminateProcess hand, exitCode
'关闭进程的内核对象......(除非对内核对象的所有引用都已关闭,否则该对象不会实际删除)
CloseHandle hand
End Sub
Private Sub Timer2_Timer()
CheckProcess
End Sub
Private Sub Timer1_Timer()
ListProcess
End Sub
'将正在运行的应用程序加到列表控件中
Sub FindAllApps()
Dim hwCurr As Long
Dim intLen As Long
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) + 1
strTitle = Space$(intLen)
'取得窗体的标题(caption)文字
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)
Loop
End Sub
Public Function CheckPath(ByVal PathStr As String) As String
On Error Resume Next
'返回一个字符串,该字符串中指定的子字符串已被替换成另一子字符串,并且替换发生的次数也是指定的。
PathStr = Replace(PathStr, "\??\", "")
If UCase(Left$(PathStr, 12)) = "\SYSTEMROOT\" Then PathStr = GetWinDir & Mid$(PathStr, 12)
CheckPath = PathStr
End Function
新建一个进程的命令
' OpenProcess函数声明
Private Declare Function OpenProcess 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 Long
Private Sub close_Click()
Unload Me
End Sub
Private Sub cmdnew_Click()
cmdialog.DialogTitle = "浏览"
cmdialog.Filter = "程序|*.exe|所有文件|*.*"
cmdialog.ShowOpen
Combo1.Text = cmdialog.
End Sub
Private 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 Me
err:
MsgBox "Windows 找不到文件" & Combo1.Text & "。
请确定文件名是否正确后,再试一次。
要搜索文件,请单击[开始]按钮,然" & Chr(13) & Chr(10) & "后单击“搜索”。
", vbExclamation, Combo1.Text
Combo1.SetFocus
Combo1.SelStart = 0
Combo1.SelLength = Len(Combo1.Text)
End Sub
Private Sub Combo1_Change()
If Combo1.Text = "" Then
cmdOK.Enabled = False
Else
cmdOK.Enabled = True
End If
End Sub
Private Sub Form_Load()
SetTop Me, True
End Sub
五、完成的情况以及使用说明
与系统的任务管理器对比:
新建任务:
六、总结
课题研究设计的进程管理器能够显示任务信息,显示进程、线程模块等信息,能够结束任务、终止进程,并能以图表的形式显示CPU使用率,以数据的形式显示内存使用情况,操作简单,能基本满足用户对Windows进程管理的需求。
但有些进程管理的高级功能还未在设计之中,如对进程模块(DLL文件)的卸载与加载、对异常进程的警告等,今后还需进一步学习和了解Windows核心编程,熟悉动态链接库DLL的操作等知识。
通过课题的研究,得出一个重要结论:在VC环境进行Windows系统编程,不仅需要熟悉VC编程环境,还需要熟悉和利用系统提供给我们的许多编程接口,即API编程,这样能大大地提高编程效率。
在课题的设计过程中,任务信息、进程信息和系统资源使用情况都是利用API函数而取得的。
通过课题的设计,巩固了以前所学的基本知识,更学到了软件设计的基本方法、技巧和流程,这对以后的学习工作有很大的帮助。
经过一个星期的课程设计,我从一个从未接触过MFC的新手到现在对MFC有了一定程度的了解,在此期间,我上网查阅了相关的资料,看网上视频教程和查阅图书馆的相关书籍,并在一些同学的帮助下,终于完成了这份粗糙的作品。
通过这次课程设计中,我学到了很多关于MFC的只是,同时也对VC++有了更深的认识,并对编程有了新的看法。
当然,在此过程中我也遇到了很多问题,有的问题经过研究科最终被解决了,有的问题却仍然存在,以下是我做这个实验遇到的问题,以及一些解决的方法:
第一、通过本次试验,在“启动新进程”的实现函数里调用了MultiByteToWideChar,表示把多字节字符转为宽字节字符,它跟WideCharToMultiByte()函数(宽字节字符转为多字节字符)极容易混淆,实际上MultiByteToWideChar和WideCharToMultiByte是互逆的过程,MultiByteToWideChar是将普通字符串转化为Unicod,而WideCharToMultiByte正好相反。
它们的操作过程相类似,在使用时首先要申请数组空间,然后分配响应的数组空间,接着是进行字符间的转换了,最后还要释放所占用的内存。
这两个函数的缺点在于无法动态分配内存,在转换很长的字符串时可能会浪费较多内存空间,优点是在不考虑浪费空间的情况下转换较短字符串非常方便。
第二、在窗体界面美化方面。
窗体的美化方法有很多,可以在PushButton控件中美化,可以在GroupButton控件中美化,可以在Edit控件中美化,在Static控件中美化等等,本系统是在PushButton控件中美化的,自定义一个基于Cbutton的子类CSXButton,在CSXButton 函数里对整个BUTTON控件进行绘制。
此次课程设计由于时间和技术的问题,有很多地方还做得不够好,存在很多不足,有很地方还需要改进,在程序的设计方面。
因为对MFC和VC++编程不太熟悉,在做设计的过程中遇到了很多问题,耗费了很多时间在代码的修改和调试上,还有很多界面的设置不能如愿实现,今后应在程序的编写上下苦功,不断加强自己的编程的能力。
七、参考文献
《计算机操作系统教程(第4版)》清华大学出版社张尧学等《操作系统安全》武汉大学出版社贾春福、郑鹏
《操作系统课程设计》机械工业出版社罗宇等。