gpt4 book ai didi

winapi - 在 WinMain 中没有消息循环有多可取?

转载 作者:行者123 更新时间:2023-12-04 13:07:49 27 4
gpt4 key购买 nike

这可能是有史以来最简单的win32程序..

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR cmdLine, int show)
{
MessageBox(0, "Hello world..", "Salutations!", MB_OK);
return 0;
}

..它不会对通常的 GetMessage() 调用进行任何调用。我的问题是:如果我的程序不处理任何窗口消息,操作系统可以处理吗?即,它会导致内存泄漏吗?或者除非我运行它 16K 次否则不会出现的其他一些资源?

从更广泛的意义上说,Win32 究竟对处理其消息的应用程序有多“依赖”?我希望当编译器将可执行文件作为 Windows 程序链接时,运行时能够清理任何类型的消息队列,无论它是否被清空。

最佳答案

只是技术性问题,但您确实有一个窗口,并且确实有一个消息循环,只是不在您的代码中。

调用 MessageBox()创建一个窗口(类#32770)并运行一个本地消息循环,直到消息循环退出时才返回到您的代码,大概是当WM_NCDESTROY已发送。我认为这与响应 DialogBox() 时运行的消息循环相同。 .

但是您可以将您的电话替换为 MessageBox()任何其他真正不会创建消息循环的东西,你仍然会没事的。 Windows 不关心您是否有消息循环,尽管如果没有它,某些功能(主要是与 UI 相关的)很难或无法使用。事实上,你根本不需要链接到 user32,一些没有用户界面的应用程序也不需要。

现在,如果您创建一个窗口并且不以某种方式为其处理消息,Windows XP 及更高版本会将您的窗口替换为具有白色客户区的“幽灵”窗口,并且任务管理器将告诉用户该应用程序不是回应。

虽然一开始看起来如此,但消息循环并不是魔术,也不是 Windows 样板文件中严格要求的部分。但是,在大多数 Windows 应用程序中,它作为一种根深蒂固的标准是根深蒂固的,因为它是处理窗口消息调度的最佳方式。大多数 Windows 应用程序的“事件驱动”性质有时让我们忘记了 Windows 应用程序最初设计为单线程的,在这个模型中,它是在单线程中运行的代码,而不是操作系统中一些看不见的力量,这必须在我们的代码中进行每个函数调用。多线程的添加在一定程度上改变了这一点,但基本模型仍然保持不变。

编辑

关于消息队列的说明:

正如在别处提到的,消息队列仅在该线程创建窗口时创建(并且基于每个线程)。您的示例程序在创建消息框时确实会创建一个消息队列。但是当您的应用程序退出时,此队列不必为空。这个队列只是一个内存结构。它是一 block 内存,可以保存一定数量的消息对象(指定目标 hWnd、消息 id、wParam、lParam、消息发布时的系统时间、消息发布时的鼠标位置,以及一些允许派生键盘和消息发布时的鼠标按钮状态),以及指向队列头部和尾部的指针(我假设它是一个循环队列)。当应用程序退出时,这个内存,就像所有属于进程的内存一样,被立即释放。

当然,在您的流程之外,还有其他必须清理的东西。操作系统必须保留所有现有窗口的表格,例如,连同创建它们的线程和进程。当然,这些也会自动清理。

关于winapi - 在 WinMain 中没有消息循环有多可取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/936710/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com