Windows程序的入口是哪里?写出windows消息机制的流程
http://www.jobui.com/mianshiti/it/cpp/5059/
入口点是winmain函数;
Windows中有一个系统消息队列,对于每一个正在运行的windows应用程序,系统为它建立一个消息队列,即应用程序队列,用来存放该程序可能创建的各种窗口消息。应用程序中有一段“消息循环”代码,用来从消息队列中取出消息并分发到相应的窗口函数中。
Windows为当前正在执行的程序维护一个消息队列,当发生输入事件时,windows把事件转换为一个消息,并将消息放入程序的消息队列中。程序通过一块叫消息循环的代码从消息队列中取出消息:
while (GetMessage(&msg,NULL,0,0))
{
//将msg结构传给Windows,进行一些键盘转换
TranslateMessage(&msg);
//将msg回传给windows,然后windows将msg发送给响应的窗口消息处理程序
DispatchMessage(&msg);
}
Postmessage()将消息直接加入到应用程序的消息队列,不等程序返回就退出。Sendmessage()应用程序处理完该消息后,才返回。
http://blog.csdn.net/stpeace/article/details/8972881

- 程序员实现winmain函数和窗口回调函数;
- Windows调用winmain()函数,启动应用程序,同时windows为应用应用程序建立一个消息队列,用于存储窗口消息;
- Winmain函数调用windows的API函数,比如createwindow和showwindow(),生成并显示一个窗口。调用createwindow()时会产生一个消息,但是该消息并不会添加到消息队列中,窗口回调函数依旧会处理该消息。
- Winmain()函数调用windows的api函数,比如GetMessage()从消息队列取出消息。假设用户在窗口中点击鼠标,windows会将该事件包装成一个消息并添加到消息队列,GetMeassage()取出该消息,并DispatchMessage()到windows;
- Windows会把该消息发送到窗口回调函数,并对函数进行调用。
- 窗口回调函数进行消息处理,通常的处理方式为调用windows api函数。
虚继承
http://www.cnblogs.com/BeyondAnyTime/archive/2012/06/05/2537451.html
什么时候使用常引用
临时对象都是常引用;
引用型参数尽量定义为常引用;
什么是死锁
模态对话框与非模态对话框的现象与本质区别
当程序显示一个模态对话框时,用户不能再对话框和该程序其他窗口键切换,用户必须先明确终止该对话框,通常点击OK或Cancel按钮来实现。
区别:
- 非模态对话框包括标题栏和系统菜单框。标题栏和系统菜单框允许用户将对话框移动到其他地方,通常不会为模态对话框提供标题栏和系统菜单框,因为用户无法为它下面的窗口做任何事情。
- 非模态对话框的样式语句必须包括WS_VISIBLE,如果不包含WS_WISIBLE就需要调用ShowWindow()c才能显示对话框。
- 非模态对话框的消息要进入你程序的消息队列,消息队列需要改动才能把消息传递给对话框窗口过程。具体做法:createDialog()时返回一个全局句柄hDialog,在消息队列中通过IsDialogMessage(hDialog,&sg)判断消息是否发送给对话框;终止对话框时,在windows对话框窗口过程的WM_CLOSE消息添加响应,DestroyWindow(hDlg);hDialog=NULL;
List和vector区别
Vector为存储对象分配连续的内存空间,随机访问效率高;在vector中插入或删除某个元素,需要对现有元素进行拷贝、复制,如果现有元素比较大或者说构造函数比较复杂,那么拷贝时开销就会比较大。对于简单的对象,vector优于list。Vector每次扩展容量时,将容量扩展为原来容量的2倍,对于小对象来说,效率还是很高的。
List是离散存储的,随机访问时需要遍历整个list。在list中插入删除元素,尤其是在首尾操作,效率很高,只需要修改指针。
Vector适用于元素数量比较稳定,对象简单,随机访问笔记频繁。
List:适用于对象数量变化大,对象复制,插入删除操作频繁。
熟悉设计模式吗,实现单例模式
http://www.cnblogs.com/cxjchen/p/3148582.html
A.exe及它包含的B.dll,C.dll,E.dll都包含common.lib,common.lib中包含static a,请问a在内存中的分布
键盘中输入一系列整数,以-1为结束,将输入的数据保存到data.txt中
int SavetxtFile()
{
FILE *pf =fopen("data.txt","w+");
if (!pf)
{
puts("open file error!");
return -1;
}
int n;
while (true)
{
printf("input a num:");
scanf("%d",&n);
if (n==-1)
break;
fprintf(pf,"%d ",n);
}
fclose(pf);
puts("ok");
return 0;
}
C++程序中编译C语言函数后,为什么要加extern c
C++里面有函数重载机制,为了区分重载函数,编译时需要把参数信息写入函数名中,fun_int_int,这样就导致编译前后函数名不一致。
但C语言中没有重载机制,所以,在C++中声明C的函数原型或为C写函数实现时,需要加上extern c,加上extern c表明编译时这个函数要保留原有的函数名。
实现strcpy函数
实现strlen函数
实现字符串倒序
指针常量与常量指针
指针常量:
Int * const p;
指针是修饰语,常量是本质;常量必须要初始化,初始化之后不可改变,所以最后,指针的地址值不可以改变。
该指针是一个常量,指针的地址不可以改变。
常量指针:
Cons tint *p;
它是一个指向常量的指针,就是指向对象是一个常量,不可以通过指针修改变量的值。 |