Difference between Windows and Console application
Asked Answered
A

7

59

What differences are there between Windows and Console applications ?

When creating a new project in Visual C++ , it asks to choose either of the above .

Ainslie answered 22/2, 2009 at 13:17 Comment(0)
D
90

The sole difference is that a console application always spawns a console if it isn't started from one (or the console is actively suppressed on startup). A windows application, on the other hand, does not spawn a console. It can still attach to an existing console or create a new one using AllocConsole.

This makes Windows applications better suited for GUI applications or background applications because you usually don't want to have a terminal window created for those.

On a more technical note, the only difference between a Console and a Windows executable is one byte in the PE header of the exe file. Toggling this byte manually (e.g. using a hex editor) converts the application type. This is a well-published hack that is used to create console applications in VB6 (where this type of application was not explicitly supported).

To determine and change the subsystem type of an application, you need to read parts of the PE header. The address of the subsystem data is not fixed though, because it's part of the optional file header whose position is determined by an address stored in the DOS file header (in the member e_lfanew). This address actually points to the _IMAGE_NT_HEADERS record which, in turn, includes the IMAGE_OPTIONAL_HEADER32 structure. This has an int161) member called Subsystem. The member's value is 2 for a Windows application and 3 for a console application. Other subsystems exist (in particular, POSIX and kernel). I've written a small VB6 application to change the subsystem of an application, which can be downloaded from ActiveVB as source code.

The PE format isn't very well documented but this document may serve as an introduction: Peering Inside the PE: A Tour of the Win32 Portable Executable File Format.


1) This doesn't really contradict my claim that only one byte differs: the most significant byte of this member is always 0. Only the least significant byte changes.

Depute answered 22/2, 2009 at 13:21 Comment(3)
Aren't there differences in referenced DLLs too?Cashandcarry
@SoapBox: see updated answer. The address isn't fixed, it has to be calculated. I've posted a link to some VB6 code to read this data. The MSDN article also shows how to do this.Depute
My father used to just replace the linker with a custom program that changed the linker command line in the appropriate file and then run the actual linker on it. The end result is the same as toggling the byte in the executable, of course :)Herbivorous
F
20

Besides the difference mentioned by Konrad, console and Windows applications behave differently when called interactively from the command prompt:

When you start a console application, the command prompt doesn't return until the console application exits. When you start a windows application, the command returns immediately.

This is not true for batch files; they will always wait until the application exits. (You can always use the start command to start an application without waiting.)

Forging answered 22/2, 2009 at 13:34 Comment(0)
S
5

You can change the Subsystem with the EDITBIN.exe (MSDN Entry on EDITBIN.exe)

Spritsail answered 8/11, 2012 at 12:9 Comment(1)
It would be useful to quote important parts from the link, in case it no longer works.Bilabiate
S
4

The difference is in the way the apps are stubbed out. When you use the console template, you have a stub that will fire up in a console. If you are already running in a console, it ignores the call to spin one up.

By the same token, a windows app is designed with a default form. If you want to clear it out, you can create a formless Windows Forms application that is essentially a console application without a console window.

As far as the guts of the app goes, they are essentially the same. The major difference is added on at the compile stage.

Shuster answered 22/2, 2009 at 14:26 Comment(0)
A
4

Message Loop is also one of the difference:

http://en.wikipedia.org/wiki/Message_loop_in_Microsoft_Windows

Ayakoayala answered 5/8, 2010 at 11:20 Comment(1)
Isn't it an optional component? Like you code it yourself, nothing magically bundled into the translated binary...Slowly
V
2

Console application runs from a windows command line (start / run / cmd)

A Window application is preset so you can program a GUI application that runs within the Windows environment.

Vonnie answered 22/2, 2009 at 13:20 Comment(0)
S
2

The entry point of console applications is wmain (since Visual studio 2008 IIRC), main if you opt out of Unicode-by-default. For desktop ones, it's wWinMain/WinMain.

That is not to say that the techniques are otherwise mutually exclusive. Console applications can still use the whole gamut of Win32 API, and desktop ones can use console I/O (but they have to explicitly create a console window first).

Shown answered 4/6, 2020 at 13:27 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.