一、单选题.................................................................................................................................................................................. 1 二、多选题.................................................................................................................................................................................. 2 三、填空题.................................................................................................................................................................................. 3 四、判断题.................................................................................................................................................................................. 4 五、简答题.................................................................................................................................................................................. 4
1..动态连接库的两种方式? ................................................................................................................................................ 4 2.列举几种进程的同步机制,并比较其优缺点。 ........................................................................................................... 4 3.进程之间通信的途径 ....................................................................................................................................................... 5 4. ASSERT()是干什么用的 ................................................................................................................................................. 5 5.winsock建立连接的主要实现步骤? ............................................................................................................................... 6 6.MFC中CString是类型安全类么? ............................................................................................................................... 6 7.进程和线程的差别。 ....................................................................................................................................................... 6 8.请简述PeekMessage和GetMessage的区别。 ............................................................................................................. 7 9.请列出你所知道的在Windows SDK平台上,实现计时功能的方法。 ..................................................................... 7 10.程序什么时候应该使用线程,什么时候单线程效率高。 ......................................................................................... 8 11.使用线程是如何防止出现大的波峰。 ......................................................................................................................... 8 12.TCP/IP 建立连接的过程?(3-way shake) ...................................................................................................................... 8 13.IP组播有那些好处? ...................................................................................................................................................... 9 14. CArray,CList,CMap分别是什么,他们的优缺点 ................................................................................................ 9 15.用什么函数开启新进程、线程。 ............................................................................................................................... 10 16.SendMessage和PostMessage有什么区别 ................................................................................................................. 10 17.CMemoryState主要功能是什么 ................................................................................................................................. 10 18.windows消息系统由哪几部分构成? ....................................................................................................................... 12 19.什么是消息映射? ....................................................................................................................................................... 12 20.什么是UDP和TCP的区别是什么?........................................................................................................................ 12 21.构成Win32 API 函数的三个动态链接库是什么? .................................................................................................. 13 22.创建一个窗口的步骤是? ........................................................................................................................................... 13 23.模态对话框和非模态对话框有什么区别? ............................................................................................................... 13 24.从EDIT框中取出数据给关联的变量,已经把关联的变量的数据显示在EDIT框上的函数是什么? ............. 13 25.简单介绍GDI? ........................................................................................................................................................... 14 26.windows消息分为几类?并对各类做简单描述。.................................................................................................... 14 27.如何自定义消息? ....................................................................................................................................................... 14 28.简述Visual C++ 、Win32 API和MFC之间的关系? ............................................................................................ 14 29. MFC中,大部分类是从哪个类继承而来? ............................................................................................................... 15 30.IP地址的编码分为哪俩部分? .................................................................................................................................. 15 六、编程分析题 ........................................................................................................................................................................ 15 七、编程题................................................................................................................................................................................ 15
1.写一个socket通讯程序................................................................................................................................................. 15 2.定义一个CMyRect类{w宽度,h高度} 分别用CList。CMap,CArray,增加6个CMyRect,修改第3个CMyRect,删除第4个CMyRect,遍历所有的CMyRect,清除所有 .............................................................................................. 21
一、单选题
1. Win32下的线程的哪一种优先级最高? ( C)
A. THREAD_PRIORITY_HIGHEST 高优先级
B. THREAD_PRIORITY_IDLE 最低优先级,仅在系统空闲时执行
C. THREAD_PRIORITY_TIME_CRITICAL 最高优先级
D. THREAD_PRIORITY_ABOVE_NORMAL 高于普通优先级
2. 下面四个选项中,哪一个不是WinMain函数的参数? (D )
A. HINSTANCE B. INT
C. LPSTR D. WPARAM
3. 当调用Windows API函数InvalidateRect,将会产生什么消息(A)
A. WM_PAINT B. WM_CREATE
C. WM_NCHITTEST D. WM_SETFOCUS
二、多选题
1. CreateFile( )的功能有哪几个? (AB )
A. 打开文件 B. 创建新文件
C. 文件改名 D. 删除文件
2. 下面哪些是句柄(HANDLE)? (ABCD )
A. HINSTANCE 实例句柄B. HWND 窗口句柄
C. HDC 设备描述符号句柄 D. HFONT 字体句柄
三、填空题
1. SendMessage和PostMessage都会向窗体发送一个消息,但SendMessage将一条消息发送到指定窗口,立即处理而PostMessage将一条消息投递到指定窗口的消息队列,不需要立即处理。
2. Windows API的中文意义是windows应用程序接口。
3. API LoadBitmap()的功能是从指定的模块和或应用程序实例中读取位图数据到内存。
4. CSingleLock是用来 同步多个线程对一个数据类的同时访问
5. NEWTEXTMETRIC 是物理字体结构,用来设置字体的高宽大小 6. int i=10, j=10, k=3; k*=i+j; k最后的值是?60 答:60,此题考察优先级,实际写成: k*=(i+j);,赋值运算符优先级最低
7. ICMP是Internet控制报文协议协议,处于网络层(IP层)层?
四、判断题 五、简答题
1..动态连接库的两种方式?
答:调用一个DLL中的函数有两种方法:
1.载入时动态链接(load-time dynamic linking),模块非常明确调用某个导出函数,使得他们就像本地函数一样。这需要链接时链接那些函数所在DLL的导入库,导入库向系统提供了载入DLL时所需的信息及DLL函数定位。
2.运行时动态链接(run-time dynamic linking),运行时可以通过LoadLibrary或LoadLibraryEx函数载入DLL。DLL载入后,模块可以通过调用GetProcAddress获取DLL函数的出口地址,然后就可以通过返回的函数指针调用DLL函数了。如此即可避免导入库文件了。
2.列举几种进程的同步机制,并比较其优缺点。
答:原子操作
信号量机制
自旋锁
管程,会合,分布式系统
3.进程之间通信的途径
答 共享存储系统
消息传递系统
管道:以文件系统为基础
4. ASSERT()是干什么用的
答:ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。例如,变量n在程序中不应该为0,如果为0可能导致错误,你可以这样写程序:
......
ASSERT( n != 0);
k = 10/ n;
......
ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略。
assert()的功能类似,它是ANSI C标准中规定的函数,它与ASSERT的一个重要区别是可以用在Release版本中。
5.winsock建立连接的主要实现步骤?
答:服务器端:socker()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接。
客户端:socker()建立套接字,连接(connect)服务器,连接上后使用send()和recv(),在套接字上写读数据,直至数据交换完毕,closesocket()关闭套接字。
服务器端:accept()发现有客户端连接,建立一个新的套接字,自身重新开始等待连接。该新产生的套接字使用send()和recv()写读数据,直至数据交换完毕,closesocket()关闭套接字。
6.MFC中CString是类型安全类么?
答:不是,其它数据类型转换到CString可以使用CString的成员函数Format来转换
7.进程和线程的差别。
答:线程是指进程内的一个执行单元,也是进程内的可调度实体.
与进程的区别:
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
8.请简述PeekMessage和GetMessage的区别。
答: Peekmessage和Getmessage都是向系统的消息队列中取得消息,两个函数的不同在于取不到消息的时候,若Getmessage()向消息队列中取不到消息,则程序的主线程会被OS(操作系统)挂起,等到有合适的消息时才返回;若是用Peekmessage()在消息队列中取不到消息,则程序会取得OS控制权,运行一段时间。
另外,在处理消息的时候,GetMessag()会将消息从队列中删除,而PeekMessage()可以设置最后一个参数wRemoveMsg来决定是否将消息保留在队列中。
9.请列出你所知道的在Windows SDK平台上,实现计时功能的方法。
答:可以使用SetTimer函数创建一个计时器,SetTimer的函数原型如下:
UINT_PTR SetTimer( HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc
10.程序什么时候应该使用线程,什么时候单线程效率高。
答:1.耗时的操作使用线程,提高应用程序响应
2.并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。
3.多CPU系统中,使用线程提高CPU利用率
4.改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。
其他情况都使用单线程。
11.使用线程是如何防止出现大的波峰。
答:意思是如何防止同时产生大量的线程,方法是使用线程池,线程池具有可以同时提高调度效率和限制资源使用的好处,线程池中的线程达到最大数时,其他线程就会排队等候。
12.TCP/IP 建立连接的过程?(3-way shake)
答:在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
13.IP组播有那些好处?
答:Internet上产生的许多新的应用,特别是高带宽的多媒体应用,带来了带宽的急剧消耗和网络拥挤问题。组播是一种允许一个或多个发送者(组播源)发送单一的数据包到多个接收者(一次的,同时的)的网络技术。组播可以大大的节省网络带宽,因为无论有多少个目标地址,在整个网络的任何一条链路上只传送单一的数据包。所以说组播技术的核心就是针对如何节约网络资源的前提下保证服务质量。
14. CArray,CList,CMap分别是什么,他们的优缺点
它们都是MFC模板库。
CArray: CArray动态数组。CArray适用于元素单个或批量添加,批量访问的场合。而不适宜对元素反复插入、删除、查找的场合。
Clist:CList是一个双向链表。CList适合于频繁的插入、删除节点的场合
Cmap: CMap字典类,它将关键字与值建立了一一对应的关联关系。通过关键字,可以迅速查找到对应的值。CMap的查找效率非常高。
15.用什么函数开启新进程、线程。
答案:
线程:CreateThread/AfxBeginThread等
进程:CreateProcess等
16.SendMessage和PostMessage有什么区别
答案:SendMessage是阻塞的,等消息被处理后,代码才能走到SendMessage的下一行。PostMessage是非阻塞的,不管消息是否已被处理,代码马上走到PostMessage的下一行。
17.CMemoryState主要功能是什么
答案:查看内存使用情况,解决内存泄露问题。
void testfc(void)
{
char* s;
s=(char*)malloc(1024);
//free(s);
}
void main()
{
CMemoryState oldMemState, newMemState, diffMemState;
oldMemState.Checkpoint();
testfc();
newMemState.Checkpoint();
newMemState. DumpStatistics();//打印信息内存
if( diffMemState.Difference( oldMemState, newMemState ))
{
//diffMemState.DumpStatistics();
printf( \"Memory leaked!\\n\" );
}
}
18.windows消息系统由哪几部分构成?
由一下3部分组成:
1. 消息队列:操作系统负责为进程维护一个消息队列,程序运行时不断从该消息队列中获取消息、处理消息;
2. 消息循环:应用程序通过消息循环不断获取消息、处理消息。
3. 消息处理:消息循环负责将消息派发到相关的窗口上使用关联的窗口过程函数进行处理。
19.什么是消息映射?
消息映射就是让程序员指定MFC类(有消息处理能力的类)处理某个消息。然后由程序员完成对该处理函数的编写,以实现消息处理功能。
20.什么是UDP和TCP的区别是什么?
TCP的全称为传输控制协议。这种协议可以提供面向连接的、可靠的、点到点的通信。
UDP全称为用户报文协议,它可以提供非连接的不可靠的点到多点的通信。
用TCP还是UDP,那要看你的程序注重哪一个方面?可靠还是快速?
21.构成Win32 API 函数的三个动态链接库是什么?
答:内核库 kerner32.dll,用户界面管理库 user32.dll,图形设备界面库 gdi32.dll。
22.创建一个窗口的步骤是?
答:填充一个窗口类结构->注册这个窗口类->然后再创建窗口->显示窗口->更新窗口。
23.模态对话框和非模态对话框有什么区别?
答:1.调用规则不同:前者是用DoModal()调用,后者通过属性和ShowWindow()来显示。
2.模态对话框在没有关闭前用户不能进行其他操作,而非模态对话框可以。
3.非模态对话框创建时必须编写自己的共有构造函数,还要调用Create()函数。
24.从EDIT框中取出数据给关联的变量,已经把关联的变量的数据显示在EDIT框上的函数是什么?
答: UpdateData(TRUE), Updatedata(FALSE).
25.简单介绍GDI?
答;GDI是Graphics Device Interface 的缩写,译为:图形设备接口;是一个在Windows应用程序中执行与设备无关的函数库,这些函数在不同的输出设备上产生图形以及文字输出。
26.windows消息分为几类?并对各类做简单描述。
1.窗口消息:与窗口相关的消息,除WM_COMMAND之外的所有以WM_开头的消息;
2.命令消息;用于处理用户请求,以WM_COMMAND表示的消息;
3.控件通知消息:统一由WM_NOTIFT表示,
4.用户自定义消息。
27.如何自定义消息?
使用WM_USER 和WM_APP两个宏来自定义消息,
28.简述Visual C++ 、Win32 API和MFC之间的关系?
(1) Visual C+是一个以C++程序设计语言为基础的、集成的、可视化的编程环境;
(2) Win32 API是32位Windows操作系以C/C++形式提供的一组应用程序接口;
(3) MFC是对Win32 API的封装,简化了开发过程。
29. MFC中,大部分类是从哪个类继承而来?
CObject
30.IP地址的编码分为哪俩部分?
答 IP地址由两部分组成,网络号和主机号。
六、编程分析题 七、编程题
1.写一个socket通讯程序
1. WinSocket编程 // 服务器代码
#include #include void main() { WORD wVersionRequested; //版本号 WSADATA wsaData; //数据 int err; wVersionRequested = MAKEWORD(1,1); err = WSAStartup(wVersionRequested,&wsaData); if( err != 0) { return; } if(LOBYTE( wsaData.wVersion ) != 1|| HIBYTE( wsaData.wVersion) != 1) { WSACleanup(); return; } SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); //建立套接字 SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //绑定端口 listen(sockSrv,5); //转换socket套接子为侦听套接子 SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); while(1) //无限循环 { SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); char sendBuf[100]; sprint(sendBuf,\"Welcome %s to http://www.sunxin.org\ inet_ntoa(addrClient.sin_addr)); send(sockConn,sendBuf,strlen(sendBuf)+1,0); char recvBuf[100]; recv(sockConn,recvBuf); printf(\"%sn\ closesocket(sockConn); WSACleanup(); } } 注:这是Server端;File->New->Win32 Console Application,工程名:TcpSrv;然后,File->New->C++ Source File,文件名:TcpSrv;在该工程的Setting的Link的Object/library modules项要加入ws2_32.lib #include #include void main() { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(1,1); err = WSAStartup(wVersionRequested,&wsaData); //启动winsock Dll if( err != 0) { return; } if(LOBYTE( wsaData.wVersion ) != 1||HIBYTE( wsaData.wVersion) != 1) { WSACleanup(); return; } SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=inet_addr(\"127.0.0.1\"); addrSrv.sin_family=AF_INET; addrSrv.sin_port = htons(6000); connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); char recvBuf[100]; recv(sockClient,recvBuf,100,0); printf(\"%sn\ send(sockClient,\"This is zhangsan\ closesocket(sockClient); WSACleanup(); } 注:这是Client端;File->New->Win32 Console Application,工程名:TcpClient;然后,File->New->C++ Source File,文件名:TcpClient;同理,在该工程的Setting的Link的Object/library modules项要加入ws2_32.lib 2.定义一个CMyRect类{w宽度,h高度} 分别用CList。CMap,CArray,增加6个CMyRect,修改第3个CMyRect,删除第4个CMyRect,遍历所有的CMyRect,清除所有 class CMyRect { public: int m_w; int m_h; public: CMyRect(int w=0,int h=0) { m_w = w; m_h = h; } }; void CArrayTest(); void CListTest(); void CMapTest(); void main() { CArrayTest(); CListTest(); CMapTest(); } void CArrayTest() { int i; CArray for(i=0;i<6;i++)//增加6个CMyRect { ca.Add(CMyRect(10+1,10*i)); } ca.SetAt(2,CMyRect(1,1));//修改第3个CMyRect ca.RemoveAt(3,1);//删除第4个CMyRect //遍历所有的CMyRect for(i=0;i< ca.GetSize();;i++) { CmyRect rect = ca.GetAt(i); TRACE(\"%d:%d-%d\\n\ } ca.RemoveAll();//清除所有 } void CListTest() { int i; CList for(i=0;i<6;i++) {//增加6个CMyRect,尾部增加 clist.AddTail(CMyRect(10+1,10*i)); } //修改第3个CMyRect POSITION p; p = clist.FindIndex(2); clist.SetAt(p,CMyRect(1,1)); //删除第4个CMyRect p = clist.FindIndex(3); clist.RemoveAt(p); //遍历所有的CMyRect CMyRect rect; p = clist.GetHeadPosition(); for(i=0;i rect = clist.GetAt(p); TRACE(\"%d:%d-%d\\n\ clist.GetNext(p); } clist.RemoveAll();//清除所有 } void CMapTest() { int i; CMap //增加6个CMyRect,下标添加 for(i = 0;i<6;i++) { cmap[i] = CMyRect(10+1,10*i); } //修改第3个CMyRect cmap.SetAt(2,CMyRect(1,1)); //删除第4个CMyRect cmap.RemoveKey(3); //遍历所有 int len = cmap.GetHashTableSize(); CMyRect rect; for(i=0;i rect = cmap[i]; TRACE(\"%d:%d-%d\\n\ } cmap.RemoveAll();//清除所有 } 因篇幅问题不能全部显示,请点此查看更多更全内容