代码之家  ›  专栏  ›  技术社区  ›  JustJeff

在WinMain中没有消息循环有多明智?

  •  6
  • JustJeff  · 技术社区  · 17 年前

    #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程序时,运行时能够清理任何类型的消息队列,不管它是否为空。

    6 回复  |  直到 17 年前
        1
  •  11
  •   P Daddy    17 年前

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

    呼吁 MessageBox() 创建一个窗口(类为#32770)并运行本地消息循环,直到消息循环退出(可能是在 WM_NCDESTROY DialogBox() .

    但你可以打电话给我 MessageBox() 还有什么真正 创建一个消息循环,您仍然会很好。Windows不在乎是否有消息循环,尽管有些功能(主要与UI相关)如果没有它就很难或不可能使用。事实上,你根本不需要链接到user32,有些没有用户界面的应用也不需要。

    现在,如果您创建了一个窗口,但没有在中处理该窗口的消息 一些 这样,Windows XP和更高版本将用一个具有白色客户端区域的“重影”窗口替换您的窗口,任务管理器将告诉用户应用程序没有响应。

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

    编辑

    有关消息队列的说明:

    正如其他地方提到的,只有当窗口由该线程创建时,才会创建消息队列(并且是基于每个线程)。示例程序在创建消息框时,

    当然,在您的流程之外还有其他一些事情必须清理。例如,操作系统必须保留一个包含所有现有窗口的表,以及创建这些窗口的线程和进程。当然,这些都是自动清理以及。

        2
  •  4
  •   Robert    17 年前

    因为没有窗口,所以不需要消息循环。在Win32中,消息发送到windows,而不是应用程序。

        3
  •  3
  •   Michael    17 年前

    您确实有一个消息循环—MessageBox是一个模式对话框,因此包含一个消息循环。

        4
  •  2
  •   Nick Dandoulakis    17 年前

    您不必创建窗口。但还是有一些信息,比如

    • WMU定时器
    • WM_剪贴簿更新
    • WM_COPYDATA
    • 功率

    挂在窗户上也不错。

        5
  •  2
  •   1800 INFORMATION    17 年前

    如果您没有窗口,那么这很好,但是如果您有窗口,那么您需要确保为它发送消息。否则,系统会挂起广播消息,等待您的响应。这对于COM之类的东西很重要,COM为消息处理创建隐藏窗口。如果主线程不发送消息(例如,通过调用 WaitForSingleObject )然后对COM对象的调用将不会被处理,任何发送广播的程序都将显示为挂起。

        6
  •  0
  •   Joel Lucsy    17 年前