Win32应用程序、Windows窗体应用程序和控制台应用程序有什么区别?

13

我想知道Windows窗体应用程序、Win32应用程序和控制台之间的区别,我知道Windows窗体应用程序和Win32应用程序都是GUI工具,但我想知道何时使用其中一个而不是另一个,并且我是否可以将控制台应用程序转换为Windows窗体应用程序?


1
简言之:高级(forms),低级(WIN32)和最低级(console)。还请注意,您可以从这三种类型中使用表单/WIN32/控制台函数(甚至是图形)。 - Some programmer dude
3个回答

15
  • Windows Form是指一个.NET应用程序。它不是直接基于本地的Windows API,而是基于.NET基础设施构建的,其中包括一个虚拟机。

  • Win32通常指32位Windows API。然而,_WIN32宏对于32位和64位编程都有定义。作为Visual Studio项目类型,它包括GUI和控制台子系统的API级别程序。

  • Windows子系统是可执行文件头部的一个小整数值,告诉Windows这个程序需要哪些服务。可以通过例如Microsoft的dumpbin程序来检查这个值,例如dumpbin c:\windows\notepad.exe /headers | find "ubs"。在Windows 9x中,dumpbin输出可以通过文件预览功能获得,但该功能已被停止。

  • Windows中的每个进程都可以与一个控制台窗口相关联,但至多只能关联一个。

  • GUI子系统意味着Windows将不会试图为每个实例配备关联的控制台窗口。但是,该进程可以自己创建控制台窗口。通常,此子系统用于带有图形用户界面(因此,“GUI”)的普通程序,大多数链接器将其指定为“windows”。

  • 控制台子系统意味着Windows将尝试为每个实例配备关联的控制台窗口,必要时会创建一个新的窗口。

  • 请注意:

    • 相同的源代码可以构建为控制台或GUI子系统。这非常容易做到,只需更改子系统规范即可。

    • GUI子系统可执行文件具有标准流,就像控制台子系统可执行文件一样。

    • 控制台子系统可执行文件可以呈现图形用户界面,就像GUI子系统一样。

  • 默认情况下,Microsoft的工具不会接受标准的C++ main 用于GUI子系统构建。然而,这种不符合规范的行为很容易修复。只需在链接器选项中指定 /entry:mainCRTStartup
  • 使用GNU工具(g++)则不存在此问题。


    只是好奇。如果我在GUI子系统中编译一段代码,那么这种情况下的标准输出是什么?例如,如果我的代码中有一行 printf("hello world\n");,那么“hello world”是在什么时候被打印出来的? - Zheng Liu
    1
    @ZhengLiu:默认情况下,GUI子系统进程的标准流被断开并设置为null,因为默认情况下没有关联的控制台窗口。但是,您可以重定向命令中的输出流来运行程序。目前,“a>con”不起作用,但“a|more”可以使用。该程序还可以创建控制台窗口。为了使C或C++的输出(而不是API级别的输出)正常工作,至少需要重新打开C级别的流。 - Cheers and hth. - Alf

    5
    1. Windows表单应用程序是使用图形编程接口框架(如.NET、DELPHI或MFC)而不是直接调用win32 API的应用程序。
    2. 另一方面,win32应用程序通常直接处理windows api,从底层创建应用程序。
    3. 控制台应用程序没有任何图形界面。只使用命令行窗口进行数据输入和结果输出。

    1
    MFC仅适用于Win32应用程序。我相信Delphi也是如此。Windows Forms仅适用于.Net应用程序。 - Ferruccio

    5
    一个“Windows表单应用程序”是一个GUI .NET应用程序。
    一个“Win32应用程序”是一个本地的Windows GUI应用程序。
    一个“控制台应用程序”是一个没有GUI的本地应用程序。
    我不太理解你所说的“转换”一种应用程序到另一种的确切含义。但是,如果你谈论使用一些IDE并将项目转换为另一个项目:是的,这是可能的。主要区别在于你链接应用程序的.DLL文件。例如,你可以将作为“控制台”的打开的项目配置为像“Win32”一样运行。这不是非常容易,但仍然是可能的。现在,如果你想知道是否可以转换已安装的给定现有应用程序:不行。

    2
    控制台应用程序通常附加到控制台窗口。但是,它们可以完全访问Win32 API并创建其他GUI窗口。 - Ferruccio

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接