计算机网络课程设计监控IP数据包流量_第1页
计算机网络课程设计监控IP数据包流量_第2页
计算机网络课程设计监控IP数据包流量_第3页
计算机网络课程设计监控IP数据包流量_第4页
计算机网络课程设计监控IP数据包流量_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

1、四 川 理 工 学 院课 程 设 计 书 学院 计算机学院 专业 计算机科学与技术 班级 题目 监控IP数据包流量 教师 学生 课程设计小组成员及分工本小组成员: xxx yyy zzz分工:xxx 做本课程设计的目的,本课程设计的要求及本课程设计的一些内容yyy 做本课程设计的一些基础知识,本课程设计的分析,本课程设计的结果,本课程设计的总结 zzz 做本课程设计的代码,本课程设计的框架设计,本课程设计的结果验证,本课程设计的逻辑分析。目 录一、 课程设计目的和要求1 1.课程设计目的:1 2.课程设计要求:1二、 课程设计的内容1三、 课程设计核心知识3四、 课程设计框架5五、 课程设计详

2、细分析7六、 实验源代码14七、 课程设计总结30一、 课程设计目的和要求1.课程设计目的: 随着internet技术的发展,基于IP协议的网络应用成为网络技术研究与软件开发的一个重要基础,因此学习网络层的基本概念,了解IP协议的基本内容,对于掌握TCP/IP协议的主要内容和学习网络课程是十分重要的。通过本次课程设计,有助于熟悉IP包格式和加深对IP协议的理解。2.课程设计要求:编制程序,监控网络,捕获一段时间内网络上的IP数据包,按IP数据包的源地址统计出在该时间段内发出的IP包的个数,将其写入日志文件中并用图形表示出来。 程序的具体要求如下:1.在图形窗口界面下,根据用户输入的捕获时间和选

3、择的网卡输出该段时间内的IP数据包流量分析2.能够将捕获的信息写入日志文件二、 课程设计的内容1.课程设计的内容: 1)使用Winpcap,Winpcap的主要功能在于独立于主机协议(如TCP/IP)发送和接受原始数据包;2)列出网卡列表,让用户选择可用的网卡;3)使用过滤器捕获IP包,别的包都过滤掉;4)捕获IP包并按包的源地址进行统计(用链表结构进行实现)。5)将统计结果输出到图形窗口界面或输出到日志文件程序流程如图8-1所示。2. 一些必要的基础知识1. 熟悉IP首部格式2. 使用Winpcap工具WinPcap是一个基于Win32平台的,用于捕获网络数据包并进行分析的开源库.WinPc

4、ap产生的目的,就是为Win32应用程序提供这种访问方式; WinPcap提供了以下功能a) 捕获原始数据包,无论它是发往某台机器的,还是在其他设备(共享媒介)上进行交换的b) 在数据包发送给某应用程序前,根据用户指定的规则过滤数据包c) 将原始数据包通过网络发送出去d) 收集并统计网络流量信息使用Winpcap工具主要需要三个步骤: 1).安装底层驱动:在Winpcap官网()下载并安装Winpcap.exe即可2).导入库文件:下载wpdpack开发包,并在开发环境(VC)中导入Lib和Include 文件夹路径。VC导入步骤(工具->选项->目录

5、,分别在Include Files和Library Files中加入/wpdpack/Include和/wpdpack/Lib) 3).在应用程序中导入需要的DLL和头文件:方法一:VC下:工程->设置->链接 在Object/Library modules下添加ws2_32.lib wpcap.lib(注意中间的空格)方法二:在源文件中添加命令处理:#pragma comment(lib, “ws2_32.lib”)#pragma comment(lib, “wpcap.lib”)本程序将会用到的Winpcap功能有:获取本机所有适配器信息 pcap_findalldevs以混杂

6、模式打开适配器pcap_open_live编译并设置过滤器pcap_compile pcap_setfilter捕获数据包 pcap_next_ex释放打开的适配器信息pcap_freealldevs3. VC+图形窗口界面编程包括按钮,编辑框,列表框,列表控件等控件的使用4. 其他相关知识,如文件操作,链表操作等三、 课程设计核心知识1.获取本机网卡信息本课程设计要实现对数据包的捕获,首先就要获取并列出本机上的所有网卡信息,这个功能是通过Winpcap提供的pcap_findalldevs来实现的。该函数原型如下int pcap_findalldevs(pcap_if_t* alldevs,

7、 char* errbuf)pcap_if_t是一个用于描述网卡信息的结构体。里面包含了网卡的名字,描述等信息。通过这个函数可以得到一个网卡信息组成的链表。函数错误则返回-1。2.打开用户选定的网卡得到网卡信息之后,可以通过列表框等形式显示出来,在用户选择后,通过pcap_open_live打开指定网卡:pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf)函数功能:获得用于捕获网络数据包的数据包捕获描述字。参数说明:device参数为指定打开的网络设备名。snaplen参数定义

8、捕获数据的最大字节数。promisc指定是否将网络接口置于混杂模式。to_ms参数指*定超时时间(毫秒)。ebuf参数则仅在pcap_open_live()函数出错返回NULL时用于传递错误消息。这些参数中最重要的就是promisc参数,通过它可以将网卡监听设置为混杂模式,混杂模式是指不管网卡接收到的数据包是不是发给自己的,都向应用程序上传。这样可以捕获一些广播信息。本程序将监听模式设为混杂模式。3.编译并设置过滤器在打开网卡并得到网卡描述符后,可以编译并设置过滤器。 编译过滤器:int pcap_compile(pcap_t* p,struct bpf_program* 

9、   fp,char* str,int  optimize, bpf_u_int32 netmask)编译一个数据包过滤器,将一个能被核心态(kernel-level)过滤器引擎解释的程序中的高层过滤表达式(filtering expression)进行转化。pcap_compile()被用来将字符串str编译进过滤器程序(fp),程序(fp)是一个指向bpf_program结构体并被pcap_compile()赋值的指针。optimize控制是否对目标代码(resulting code)的性能进行优化。Netmask表明I

10、Pv4掩码,它仅在检查过滤器程序中的IPv4广播地址的时候被使用。返回1表示发生了错误,此时,pcap_geterr()将被用来显示错误信息。 设置过滤器int pcap_setfilter(pcap_t* p,struct bpf_program* fp)把一个过滤器同一次抓包关联起来。pcap_setfilter被用来指定一个过滤器程序。fp是一个指向bpf_program结构体的指针,通常是pcap_compile()执行的结果。当失败时返回1,此时,pcap_geterr()被用来显示错误信息;返回0表示成功。4.抓包:接下来就是最后一步抓包,Winpcap提供的抓

11、包接口主要有pcap_next_ex和pcap_loop两种pcap_loop直接由数据包捕获驱动所调用,它在底层抓取到包时,直接调用用户传入的处理函数本程序使用另一个函数pcap_next_ex: pcap_next_ex(pcap_t* p,struct pcap_pkthdr* pkt_header,const u_char* pkt_data)功能: 从interface或离线记录文件获取一个报文参数: p: 已打开的捕捉实例的描述符         pkt_header: 报文头 &#

12、160;       pkt_data: 报文内容返回值: 1: 成功 0: 获取报文超时            -1: 发生错误  -2: 获取到离线记录文件的最后一个报文四、 课程设计框架1. 核心流程图:本程序是VC下基于对话框的窗口程序。界面如下:图1主要设计流程如下1. 在OnInitialDialog中获取并显示网卡信息2. 在用户点击开始监听按钮时:a) 验证用户有效输入(验证用户是否输入有效

13、的监控时间,是否选择合适的过滤器,以及是否已选择网卡)b) 以混杂模式打开网卡c) 根据用户在列表框中的选择编译并设置过滤器d) 开始抓取报文,将结果添加到统计链表。并随时检测是否超时。e) 抓取完成之后,将结果输出到列表控件界面f) 在用户关闭窗口或者开始再次监控时提示是否将结果输入日志文件(在用户再次选择监控时,需要清空已有数据)g) 用户关闭窗口时,提示保存日志并释放打开的所有适配器信息五、 课程设计详细分析一、 相关数据结构:1. IP首部结构体IP_HEADERtypedef struct ip_headerunsigned char ver_ihl; /版本号以及首部长度unsig

14、ned char tos; /区分服务unsigned short totallen; /总长度unsigned short id; /表示unsigned short flags_fragoffset; /标志和片偏移unsigned char ttl; /生存时间unsigned char proto; /协议类型unsigned short crc; /CRC校验DWORD srcaddr;/源IP地址DWORD dstaddr;/目的IP地址unsigned int op_pad;/填充字段IP_HEADER;2. 统计的数据包信息结点CIPNode: 该类对象记录一个类型的数据包并且

15、负责管理其包的数量 class CIPNode public:unsigned char GetProtocol();void AddCount();/增加本节点计数long GetCount();/获取本节点计数long GetIPAddress();/得到本节点IP地址CIPNode(long sourceIP, unsigned char proto);virtual CIPNode();CIPNode* pNext;private:long m_lIPAdress;/源IP地址long m_lcount;/节点计数unsigned char m_proto;/协议类型;3. 统计信息链

16、表类CstatisticsList 该类维护抓取到的数据包链表class CStatisticsList public:void Init();/初始化头尾指针为空CIPNode* GetHead();/得到头指针void AddNode(long ip, unsigned char proto);/添加一个结点 如/果该结点存在 则增加其计数 如果不存在创建并添加该节点CStatisticsList();/创建一个头尾指针均为空的链表virtual CStatisticsList();/释放自身维护的链表private:CIPNode* m_pHead;/头指针CIPNode* m_pTai

17、l;/尾指针;void CStatisticsList:AddNode(long ip, unsigned char proto)if (m_pHead = NULL)/如果当前链表为空 创建一个节点 初始化头尾指针m_pHead = m_pTail = new CIPNode(ip, proto);m_pTail->pNext = NULL;else/如果链表不为空 BOOL bFind = FALSE;CIPNode* p = NULL;/遍历链表 查找传入的ipfor (p=m_pHead; p; p=p->pNext)/如果该ip已经存在 则增加其计数if (p->G

18、etIPAddress() = ip && proto = p->GetProtocol()bFind = TRUE;p->AddCount();break;/如果不存在该ip 则添加节点 更新尾指针if (bFind = FALSE)m_pTail->pNext = new CIPNode(ip, proto);m_pTail = m_pTail->pNext;m_pTail->pNext = NULL;CStatisticsList:CStatisticsList()CIPNode* pTemp;/遍历链表 依次释放节点if (m_pHead)

19、pTemp = m_pHead;m_pHead = m_pHead->pNext;delete pTemp;m_pHead = NULL;m_pTail = NULL;二、 主界面类CIPPackCap逻辑:1. 主要类成员:class CIPPackCapDlg : public CDialogpublic:void ResetData();/在用户重新开始监控时 重新初始化数据void SaveToFile();/将最近一次统计结果保存到指定文件void AskSaveToFile();/询问用户是否保存文件void EnableSomeWindow(BOOL bEnable);/在

20、监控过程中 使输入控件无效void UpdateOutput();/更新统计列表输出BOOL StartListenning();/开始抓取数据包void InitStatisticsListCtrl();/初始化统计列表控件设置void SetTipsInfo(LPCTSTR pszformat, .);/格式化并显示提示消息BOOL SetListenFilter();/设置监控过滤器BOOL OpenSelDev();/打开用户选定的适配器BOOL FindAndShowAllDevs();/查找并显示所有的适配器private:BOOL m_bHadListend;/标志用户是否是第一

21、次监控time_t m_startTime;/最近一次监控的开始时间CStatisticsList m_statisticsList;/存放监控内容的链表pcap_if_t* m_pCurSelDev;/用户选中的适配器pcap_t* m_fpSelDev;/用户选中的适配器描述符int m_iDevsCount;/适配器数目pcap_if_t* m_pAllDevs;/所有适配器指针ofstream m_filestream;/文件流 用于保存记录;2. 初始化:初始化工作在OnInitialDialog中完成: 主要代码:/ 查找并显示所有适配器 如果失败则结束程序 if(!FindAnd

22、ShowAllDevs()EndDialog(IDOK);/初始化统计列表控件设置InitStatisticsListCtrl();/设置默认过滤器(CComboBox*)GetDlgItem(IDC_COMBO_FILTER)->SetCurSel(0);3. 用户选择开始: 在响应函数OnBtnStart()中void CIPPackCapDlg:OnBtnStart() /如果之前有监听记录 询问是否保存记录到日志文件/并且重置必要数据(统计链表)if (m_bHadListend)AskSaveToFile();ResetData();UpdateData(TRUE);/验证是否

23、输入定时if(m_uListenTime = 0)MessageBox("请输入你要监控的时间");return;/是否选择有效过滤器if (m_strFilter = "")MessageBox("输入你的过滤器");return;/获取并打开用户选择的适配器if (!OpenSelDev()return;/设置监听过滤器if (!SetListenFilter()return;/输出提示信息SetTipsInfo("正在监听:%s", m_pCurSelDev->name);if(StartListenn

24、ing()/标记已经监听过m_bHadListend = TRUE;GetDlgItem(IDC_TIPS)->SetWindowText("监听正常结束");/更新输出以及界面UpdateOutput();OnBtnStart是程序的核心部分,其他模块函数都为其服务,当用户非第一次监控时,会调用AskSaveToFile函数,该函数判断用户是否在日志文件编辑框中输入文件名,如果是,则修正该文件名为.txt格式并弹出提示框提醒用户是否将上一次结果保存到日志文件图2.保存日志提示框如果用户选择是,则在AskSaveToFile中调用SaveToFile函数,将记录输出到

25、指定日志文件/*询问是否保存日志文件 如果选择是 调用SaveToFile保存记录到文件*/void CIPPackCapDlg:AskSaveToFile()/如果日志文件一栏不为空if(m_strOutputFile != "")/修正用户文件格式CString strFileExt = m_strOutputFile.Right(4);if (strFileExt != ".txt" && strFileExt != ".TXT")m_strOutputFile+=".txt"/询问用户是否保

26、存CString strTip;strTip.Format("是否将输出保存到你的日志文件: %s", m_strOutputFile);if (IDYES = MessageBox(strTip, "是否保存?", MB_YESNO)SaveToFile();下图3为生成的日志文件:图3.生成的日志文件如果用户选择再次监控,在保存日志文件后,还需要清空已收集的报文包记录和显示界面。这是通过ResetData()来完成的。该函数遍历并释放m_statisticsList所有节点,然后清空列表控件显示。实现参见附源代码之后便开始打开网卡,设置过滤器,然后开

27、始一次新的监听,监听代码如下:/开始在该适配器上不断抓包 并将捕获信息填入到统计链表BOOL CIPPackCapDlg:StartListenning()/使开始按钮和其他输入框不再响应输入EnableSomeWindow(FALSE);/获取开始时间time_t begin_time;time_t now_time;:time(&begin_time);m_startTime = begin_time;time_t left_time;struct pcap_pkthdr* ppktheader;unsigned char* ppkt_data;BOOL bNormalExit =

28、 FALSE;int ret;while(ret = pcap_next_ex(m_fpSelDev, &ppktheader, &ppkt_data) >= 0)/计算并显示剩余时间:time(&now_time);left_time = m_uListenTime - (now_time-begin_time);CString strLeftTime;strLeftTime.Format("%d秒", left_time);GetDlgItem(IDC_TIME_LEFT)->SetWindowText(strLeftTime);if

29、 (left_time <= 0)bNormalExit = TRUE;break;/超时 继续进行下一次抓包if(ret = 0)continue;/在接收到的数据中得到IP首部IP_HEADER* pheader;pheader = (IP_HEADER*)(ppkt_data+14);m_statisticsList.AddNode(pheader->srcaddr, pheader->proto);return bNormalExit;该函数通pcap_next_ex统计在一段时间内抓取到的报文到m_statisticsList。完成统计之后,通过UpdateOutp

30、ut()函数更新列表控件m_statisticsCtrl来显示链表中的统计结果。UpdateOutput通过遍历统计链表中的结果,并获取其中的信息输出到表项。通过inet_ntoa将long型IP地址转换为点分十进制的字符串。通过一个switch-case分支来解析节点中的m_proto字段属于何种协议。图4为解析过程界面图5为过滤器为udp时的运行结果:4. 关闭窗口时的处理流程:当用户选择关闭窗口时,在对话框关闭响应函数OnClose中:1.首先检测变量m_bHadListend如果为TRUE。说明用户已经至少监控过一次,调用AskSaveToFile函数。该函数首先判断用户是否输入了日志

31、文件,如果是,则修正文件格式为.txt 之后弹出消息框提示保存并负责调用SaveToFile保存。如果用户未输入日志文件名,则什么也不做。2.调用pcap_freealldevs释放m_pAllDevs中保存的所有适配器信息OnClose函数代码如下:void CIPPackCapDlg:OnClose() /询问是否保存最后一次结果if (m_bHadListend)AskSaveToFile();pcap_freealldevs(m_pAllDevs);CDialog:OnClose();5.其余模块函数可参见附源码。三、四、五、六、 实验源代码/IPNode.h/#if !defined

32、(AFX_IPNODE_H_796BA726_424A_4BD2_AB97_8D188B55AA98_INCLUDED_)#define AFX_IPNODE_H_796BA726_424A_4BD2_AB97_8D188B55AA98_INCLUDED_#if _MSC_VER > 1000#pragma once#endif / _MSC_VER > 1000class CIPNode public:unsigned char GetProtocol();void AddCount();/增加本节点计数long GetCount();/获取本节点计数long GetIPAddr

33、ess();/得到本节点IP地址CIPNode(long sourceIP, unsigned char proto);virtual CIPNode();CIPNode* pNext;private:long m_lIPAdress;/源IP地址long m_lcount;/节点计数unsigned char m_proto;/协议类型;#endif / !defined(AFX_IPNODE_H_796BA726_424A_4BD2_AB97_8D188B55AA98_INCLUDED_)/IPNode.cpp/#include "stdafx.h"#include &

34、quot;IPPackCap.h"#include "IPNode.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE=_FILE_;#define new DEBUG_NEW#endifCIPNode:CIPNode(long sourceIP, unsigned char proto)m_lIPAdress = sourceIP;m_lcount = 1;m_proto = proto;CIPNode:CIPNode()long CIPNode:GetIPAddress()return m_lIPAdres

35、s;long CIPNode:GetCount()return m_lcount;void CIPNode:AddCount()m_lcount+;unsigned char CIPNode:GetProtocol()return m_proto;/StatisticsList.h/#if !defined(AFX_STATISTICSLIST_H_B06D35E9_FCAB_48E5_88FF_BDE53D80FADA_INCLUDED_)#define AFX_STATISTICSLIST_H_B06D35E9_FCAB_48E5_88FF_BDE53D80FADA_INCLUDED_#i

36、f _MSC_VER > 1000#pragma once#endif / _MSC_VER > 1000#include "IPNode.h"class CStatisticsList public:void Init();/初始化头尾指针为空CIPNode* GetHead();/得到头指针void AddNode(long ip, unsigned char proto);/添加一个结点 如果该结点存在 则增加其计数 /如果不存在创建并添加该节点CStatisticsList();virtual CStatisticsList();private:CIPN

37、ode* m_pHead;/头指针CIPNode* m_pTail;/尾指针;#endif / !defined(AFX_STATISTICSLIST_H_B06D35E9_FCAB_48E5_88FF_BDE53D80FADA_INCLUDED_)/StatisticsList.cpp/#include "stdafx.h"#include "IPPackCap.h"#include "StatisticsList.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE=_FILE_

38、;#define new DEBUG_NEW#endifCStatisticsList:CStatisticsList()m_pHead = NULL;m_pTail = NULL;CStatisticsList:CStatisticsList()CIPNode* pTemp;/遍历链表 依次释放节点if (m_pHead)pTemp = m_pHead;m_pHead = m_pHead->pNext;delete pTemp;m_pHead = NULL;m_pTail = NULL;void CStatisticsList:AddNode(long ip, unsigned cha

39、r proto)if (m_pHead = NULL)/如果当前链表为空 创建一个节点 初始化头尾指针m_pHead = m_pTail = new CIPNode(ip, proto);m_pTail->pNext = NULL;else/如果链表不为空 BOOL bFind = FALSE;CIPNode* p = NULL;/遍历链表 查找传入的ipfor (p=m_pHead; p; p=p->pNext)/如果该ip已经存在 则增加其计数if (p->GetIPAddress() = ip && proto = p->GetProtocol()

40、bFind = TRUE;p->AddCount();break;/如果不存在该ip 则添加节点 更新尾指针if (bFind = FALSE)m_pTail->pNext = new CIPNode(ip, proto);m_pTail = m_pTail->pNext;m_pTail->pNext = NULL;CIPNode* CStatisticsList:GetHead()return m_pHead;void CStatisticsList:Init()m_pHead = NULL;m_pTail = NULL;/IPPackCapDlg.h/#if !de

41、fined(AFX_IPPACKCAPDLG_H_682FD3D7_3E3A_4785_B228_62D96973AC09_INCLUDED_)#define AFX_IPPACKCAPDLG_H_682FD3D7_3E3A_4785_B228_62D96973AC09_INCLUDED_#if _MSC_VER > 1000#pragma once#endif / _MSC_VER > 1000#include <fstream>using namespace std;#include "PCAP.H"#include "Statisti

42、csList.h"/ Added by ClassView/ CIPPackCapDlg dialogclass CIPPackCapDlg : public CDialogpublic:void ResetData();/在用户重新开始监控时 重新初始化数据void SaveToFile();/将最近一次统计结果保存到指定文件void AskSaveToFile();/询问用户是否保存文件void EnableSomeWindow(BOOL bEnable);/在监控过程中 使一些输入控件无效void UpdateOutput();/更新统计列表输出BOOL StartListen

43、ning();/开始抓取数据包void InitStatisticsListCtrl();/初始化统计列表控件设置void SetTipsInfo(LPCTSTR pszformat, .);/格式化并显示提示消息BOOL SetListenFilter();/设置监控过滤器BOOL OpenSelDev();/打开用户选定的适配器BOOL FindAndShowAllDevs();/查找并显示所有的适配器CIPPackCapDlg(CWnd* pParent = NULL);/ standard constructor/ Dialog Data/AFX_DATA(CIPPackCapDlg)

44、enum IDD = IDD_IPPACKCAP_DIALOG ;CListCtrlm_statisticsListCtrl;CListBoxm_listboxAllDevs;UINTm_uListenTime;CStringm_strOutputFile;CStringm_strFilter;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CIPPackCapDlg)protected:virtual void DoDataExchange(CDataExchange* pDX);/ DDX/DD

45、V support/AFX_VIRTUAL/ Implementationprotected:HICON m_hIcon;/ Generated message map functions/AFX_MSG(CIPPackCapDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnBtnStart();afx_msg void OnDestro

46、y();afx_msg void OnClose();/AFX_MSGDECLARE_MESSAGE_MAP()private:BOOL m_bHadListend;/标志用户是否是第一次监控time_t m_startTime;/最近一次监控的开始时间CStatisticsList m_statisticsList;/存放监控内容的链表pcap_if_t* m_pCurSelDev;/用户选中的适配器pcap_t* m_fpSelDev;/用户选中的适配器描述符int m_iDevsCount;/适配器数目pcap_if_t* m_pAllDevs;/所有适配器指针ofstream m_fi

47、lestream;/文件流 用于保存记录;/AFX_INSERT_LOCATION/ Microsoft Visual C+ will insert additional declarations immediately before the previous line.#endif / !defined(AFX_IPPACKCAPDLG_H_682FD3D7_3E3A_4785_B228_62D96973AC09_INCLUDED_)/IPPackCap.cpp/ IPPackCapDlg.cpp : implementation file/#include "stdafx.h&q

48、uot;#include "IPPackCap.h"#include "IPPackCapDlg.h"#include "IPNode.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialogpublic:CAboutDlg();/ Dialog Data/AFX_DATA(CA

49、boutDlg)enum IDD = IDD_ABOUTBOX ;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:/AFX_MSG(CAboutDlg)/AFX_MSGDECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg()

50、: CDialog(CAboutDlg:IDD)/AFX_DATA_INIT(CAboutDlg)/AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/ No message handlers/AFX_MSG_MAPEND_MESSAGE_MAP()/ CIPPackCapDlg dialogCIPPackCapDlg:CIPPack

温馨提示

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

最新文档

评论

0/150

提交评论