console – When is System.IsConsole true in Delphi? – Stack Overflow


Some highlights from [WayBack] console – When is System.IsConsole true in Delphi? – Stack Overflow:

Project/Options/Linking/Generate console application and {$APPTYPE CONSOLE} are two separate things. – [WayBack] Andreas Rejbrand.
The -cc commandline parameter for dcc32.exe (which could be in your ProjectX.cfg file!) is equivalent to “Generate console application):
Found it: the executable has been created using dcc32.exe and the dpr / cfg file, the cfg contains a line
which creates a console application. – [WayBack] mjn

Note that in Delphi XE2, OSX applications can not use this variable as it is always true. See QC Entry 98956 and Why Does My OSX FireMonkey App Think It Is a Console App ? – [WayBack] mjn

A few notes I have found out myself
The linker option “Project/Options/Linking/Generate console application” is the same as “DCC_ConsoleTarget” in the .dproj file:

<PropertyGroup Condition=”‘$(Base_Win32)’!=””>

Even setting IsConsole to True does not allocate a new console, so the STD_OUTPUT_HANDLE handle does not work!
The below method in the System unit, then does not show output:

procedure WriteErrorMessage;
Dummy: Cardinal;
if IsConsole then
with TTextRec(Output) do
if (Mode = fmOutput) and (BufPos > 0) then
TTextIOFunc(InOutFunc)(TTextRec(Output)); // flush out text buffer
// Leave #0 off end of runErrMsg
WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), @runErrMsg, Sizeof(runErrMsg) – 1, Dummy, nil);
WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), @sLineBreak[1], 2, Dummy, nil);
else if not NoErrMsg then
MessageBoxA(0, runErrMsg, errCaption, 0);

For console output, you have to enable the linker option DCC_ConsoleTarget allocates a console (if not yet allocated), enables the “STD_OUTPUT_HANDLE” handle, and sets IsConsole to True.

Comments are closed.