消息队列:
引用 https://blog.csdn.net/yaked/article/details/52354921
我们知道,代码是不断往前执行的,像我们刚才写的WinMain函数一样,如果你现在运行程序,你会发现什么都没有,是不是程序不能运行呢,不是,其实程序是运行了,只是它马上结束了,只要程序执行跳出了WinMain的右大括号,程序就会结束了。那么,要如何让程序不结束了,可能大家注意到我们在C程序中可以用一个getchar()函数来等到用户输入,这样程序就人停在那里,直到用户输入内容。但我们的窗口应用不能这样做,因为用户有可能进行其他操作,如最小化窗口,移动窗口,改变窗口大小,或者点击窗口上的按钮等。因此,我们不能简地弄一个getchar在那里,这样就无法响应用户的其他操作了。
这样消息循环就出现了,只要有与用户交互,系统人不断地向应用程序发送消息通知,因为这些消息是不定时不断发送的,必须有一个绶冲区来存放,就好像你去银行办理手续要排队一样,我们从最前端取出一条一条消息处理,后面新发送的消息会一直在排队,直到把所有消息处理完,这就是消息队列。
You must fill the structure with the appropriate class attributes before passing it to the function.
在将其传递给函数之前,必须先填充适当的class属性。
MSDN那句话的意思就是说我们在注册窗口类之前必须填充WNDCLASS结构体,何为填充,就是要为结构的所有成员赋值,就算不需要你也要为它赋一个NULL或0,因为结构在创建时没有对成员进行初始化,这就导致变量无法正确的分配内存,最后注册失败。
用于区分内核对象与其他类型的对象最容易的一种方法是 内核对象的所有函数几乎都有一个参数,可以用来设定安全属性的信息,即 PSECURITY_ATTRIBUTES
1.内核对象计数器
内核对象由内核所有,而不是由进程所有。 进程终止,内核对象不一定被撤销。如果另一个进程正在使用终止进程创建的内核对象,那么该内核知道,他还有事情要做,不会被释放,必须记住的是:内核对象的存在时间可以比创建该对象的进程长。
每个内核对象都有一个计数器,被创建后计数为1,此后,一旦有其他进程访问该内核对象,则计数递增1,当进程停止时,内核对象自动判断计数值,如果降为0,内核就撤销该对象。这样就可确保在没有任何进程引用该对象的情况时系统中不保留任何内核对象。