這是我在《Programming Microsoft Windows with C#》(此書作者是大名鼎鼎的Charles Petzold)一書中找到的描述:
This compiler switch doesn't do anything very profound. It really only sets a flag in the executable file that indicates how the program is to be loaded an run. If an executable is flagged as a Console Application and is started from Windows, the Windows operating system creates a Command Prompt window that launches the program and displays any console output from the program. If the console application is started from within the Command Prompt window, the MS-DOS promptdoesn't return until the program terminateds. If the executable is flagged as a Windows Application, no Command Prompt window is created. Any console output from the program goes into the bit bucket. If you start such a program from the Command Prompt window, the MS-DOS prompt appears again right after the program is launched. The point is this: nothing bad happens if you compile a Windows Forms application as a console application!
作者之前提到的編譯選項是/target:exe和/target:winexe,前者生成控制臺程序,后者生成Windows程序,這是C#的編譯器,而VC++的連接器的選項卻有些不同,看這張圖:

如果你在應用程序向導里指定的是一個Windows程序,而你后來卻在這個連接器選項里選擇Console,那會怎么樣呢?——會連接失敗!因為VC++連接器認為Console程序和Windows程序的入口函數是不同,這樣簡單的一改它會找不到入口函數,所以連接失敗。
但不管這樣,通過Charles Petzold的這段描述,我們對Console程序和Windows程序的認識應該是沒什么問題了,兩者其實并沒有什么根本不同,只是Windows根據PE文件中的標識,用稍微不同的方法來運行這兩種程序而已。
BTW:Windows程序可以創建自己的控制臺(參考AllocConsole等API),控制臺程序也可以創建窗口。