Warum bin ich eigentlich nicht gleich draufgekommen AttachConsole als erstes aufzurufen?
(wozu FreeConsole ... AttachConsole sagt ja auch ob's erfolgreich war)
Das einzige Problem ist jetzt nur noch, daß AttachConsole erst ab XP verfügbar ist.
Und nachprogrammieren ist für mich etwas zu hoch ... hab mal reingeschaut und da werden Dinge aufgerufen, wo ich mit meinem Unwissen nicht rankomm.
Bei allem vor XP wird AttachConsoleDummy verwendet, welches einfach nur sagt daß es nicht ging
und ab XP funktioniert es so eigentlich perfekt. > es wird kine neue Konsole geöffnet und beim Programmstart blinkt auch Keine kurz auf.
Delphi-Quellcode:
{$APPTYPE GUI}
Uses Windows;
Function AttachConsoleDummy(dwProcessId: LongWord): LongBool;
Begin
Result := False;
End;
Var AttachConsole:
Function(dwProcessId: LongWord): LongBool;
StdCall;
ConsoleOutput: Boolean = False;
AttachConsole := GetProcAddress(GetModuleHandle('
kernel32.dll'), '
AttachConsole');
If @AttachConsole =
nil Then AttachConsole := @AttachConsoleDummy;
ConsoleOutput := AttachConsole(ATTACH_PARENT_PROCESS);
// und jetzt immer wenn zur Console verbunden wurde etwas reinschreiben
// > WriteLn erzeugt eine Exception, wenn keine Console vorhanden ist (darum ConsoleOutput)
If ConsoleOutput
Then WriteLn('
irgendwas');
Oder diese kleine
Unit
Delphi-Quellcode:
Unit FSSystem;
Interface
Var ConsoleOutput: Boolean = False;
Procedure WriteConsole(S:
String);
Implementation
Uses Windows;
Var AttachConsole:
Function(dwProcessId: LongWord): LongBool;
StdCall;
Function AttachConsoleDummy(dwProcessId: LongWord): LongBool;
Begin
Result := False;
End;
Procedure WriteConsole(S:
String);
Begin
If (S = '
')
or not ConsoleOutput
Then Exit;
UniqueString(S);
CharToOemA(PAnsiChar(S), PAnsiChar(S));
WriteLn(S);
End;
Initialization
AttachConsole := GetProcAddress(GetModuleHandle('
kernel32.dll'), '
AttachConsole');
If @AttachConsole =
nil Then AttachConsole := @AttachConsoleDummy;
ConsoleOutput := AttachConsole(ATTACH_PARENT_PROCESS);
End.
und im Programm dann jeweils einfach nur noch WriteConsole aufrufen
Delphi-Quellcode:
{$APPTYPE GUI}
WriteConsole('
irgendwas');