这可能是有史以来最简单的win32程序..
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR cmdLine, int show)
{
MessageBox(0, "Hello world..", "Salutations!", MB_OK);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
..对通常的GetMessage()调用没有任何调用.我的问题是:如果我的程序没有处理任何窗口消息,操作系统可以应对吗?即,它是否会导致内存泄漏?或者其他一些不明显的资源,除非我运行16K次?
从更广泛的意义上讲,Win32对于处理邮件的应用程序究竟是如何"依赖"的?我希望当编译器将可执行文件链接为Windows程序时,运行时将能够清理任何类型的消息队列,无论是否清空.
P D*_*ddy 11
只是技术性,但你确实有一个窗口,你确实有一个消息循环,而不是在你的代码中.
调用MessageBox()创建一个窗口(类#32770)并运行本地消息循环,直到消息循环退出时才返回到您的代码,大概是在WM_NCDESTROY发送时.我认为它是响应的运行相同的消息循环DialogBox().
但是你可以用你MessageBox()真正没有创建消息循环的其他东西替换你的调用,你仍然可以.Windows并不关心你是否有消息循环,尽管有一些功能(主要是UI相关)很难或不可能没有它.实际上,您根本不必链接到user32,而某些没有用户界面的应用程序则不需要.
现在,如果您创建一个窗口并且不以某种方式处理它的消息,Windows XP及更高版本将使用具有白色客户区的"ghost"窗口替换您的窗口,并且任务管理器将告诉用户该应用程序不是响应.
虽然它起初似乎是这样,但消息循环不是魔术或Windows样板的严格要求部分.这是因为在大多数的Windows应用程序的标准高度根深蒂固,虽然,因为它是处理窗口消息的调度的最佳途径.大多数Windows应用程序的"事件驱动"特性使我们有时忘记Windows应用程序最初被设计为单线程,并且在这个模型中,它是在单个线程内运行的代码,而不是操作系统中的一些看不见的力量,必须在我们的代码中调用每个函数.多线程的添加有所改变,但基本模型仍然保持不变.
编辑
有关消息队列的说明:
如其他地方所述,当该线程创建窗口时,仅创建消息队列(并且基于每个线程).在创建消息框时,您的示例程序会创建一个消息队列.但是当您的应用程序退出时,此队列不必为空.这个队列只是一个内存结构.它是一个可以容纳一定数量的消息对象的内存块(指定目标hWnd,消息ID,wParam,lParam,发布消息时的系统时间,发布消息时的鼠标位置,以及允许派生键盘的一些数据)消息发布时的鼠标按钮状态,以及指向队列头部和尾部的指针(我假设它是一个循环队列).当应用程序退出时,该内存与属于该进程的所有内存一样,将被即时释放.
当然,还有其他事情必须在您的流程之外进行清理.操作系统必须保留所有现有窗口的表格,例如,创建它们的线程和进程.当然,这些都是自动清理的.