Did you ever try to write to the standard output using STDOUT but never seen your output in the console?
This is a little known thing about PE executable on windows that were compiled to be GUI.
The PE header contains information that indicate a mode of execution: console or GUI.
So even if your favorite compiler such as PowerBuilder (classic or .Net) doesn’t support the console application, you can turn it on just by switching 1 byte.
Here is a Perl 5.8+ script that can switch between console/GUI one or more file, (useful in a post-build process when available).
Enable console Perl script Script enable_console.pl
#!/usr/bin/perl
use strict;
$|=1;
sub patch{
my $filename = shift;
my $mode = shift;
print "file $filename ";
open my $FH, '+<', $filename or die "Unable to open file $filename!$/$!$/";
binmode $FH;
my ($buffer, $offset);
read $FH, $buffer, 0x40 or die "Unable to read file $filename $/$!$/";
die "Not a DOS executable!$/" if substr($buffer,0,2) ne 'MZ' ;
$offset = unpack( 'L', substr($buffer,0x03C,4) ) or die "Invalid PE address!";
seek ($FH, $offset, 0) or die "Unable to move at byte $offset in file $filename $!$/";
read $FH, $buffer, 0x2 or die "Unable to read file $filename $/$!$/";
die "Invalid PE format!$/" if substr($buffer,0,2) ne 'PE' ;
$offset += 0x5C;
seek ($FH, $offset, 0) or die "Unable to move at byte $offset in file $filename $!$/";
print $FH pack('c', $mode);
close $FH;
print " => OK.$/";
}
print <<USAGE unless @ARGV;
Usage:
$0 [-mode=gui|console] file1 file2 file3...
The default mode is set to console
USAGE
my $mode = 0x03;
foreach(@ARGV){
if(/^-mode\s*=\s*([A-Za-z]+)/){
die "Unknow mode $1!$/" if $1 ne 'gui' && $1 ne 'console';
print "set mode to $1$/";
$mode = 0x02 if $1 eq 'gui';
next;
}
foreach my $f ( glob $_ ){
patch $f, $mode;
}
}
Turn to console all executable of the current folder:
perl enable_console.pl "*.exe"
Turn to GUI an executable:
perl enable_console.pl --mode=gui "..\build\my_app.exe"
You can try to switch IDE so it will display it console (helpfull to debug without compiling):
perl enable_console.pl "C:\Program Files\Sybase\PowerBuilder 10.5\PB105.EXE"
BE CAREFUL: if you close the console, it will kill your application too with no way to cancel or save your pending data!
MIT LICENSE: you have a brain, take your responsibility, and do backup yourself!
If you wonder how your Powerbuilder application can write to console:
- .Net
- Classic + PBNI
- Classic + API wrapping