1.) Diese Frage gibt es hier im Forum mindestens schon einmal
2.) Vergiß es!
Kurze Begründung: a.) habe ich das sehr lange probiert und dazu auch versucht mit RE den Konsolen auf die Spur zu kommen. b.) kann es nicht gehen, weil der
PE-Loader bereits die Konsole für den Prozeß alloziert (bei APPTYPE CONSOLE). Damit bist du machtlos und die Konsole wir in jedem Fall kurz erscheinen. Selbst Tricks mit der PEB/TEB (nur unter NT) waren zwecklos. Man dreht sich dort im Kreis, weil die Überprüfung erst geschehen kann, wenn das Programm bereits läuft - zu dem Zeitpunkt existiert aber bereits eine Konsole oder sie existiert eben nicht (APPTYPE
GUI) - dann gibt's allerdings auch keine Elternkonsolhandles.
Ich denke mal, daß du das gleiche erreichen möchtest wie ich bei meinem RShutdown2 damals: daß dein Programm von einer "Elternkonsole" aus gestartet werden kann und dann dort seine Ausgaben/Eingaben bekommt. Ich will nicht behaupten, daß es komplett unmöglich sei, aber es ist doch recht fragwürdig - zumal bei dem Aufwand in Sachen RE usw.
Ich habe es übrigens dann ganz pragmatisch über
FreeConsole() gelöst. So wird zwar die Konsole kurz angezeigt, ich habe aber dennoch volle Konsolenfunktionialität, wenn die Parameter dies erfordern. Logischerweise kannst du FindWindow() usw. dann auch knicken, weil Konsolennamen theoretisch verschieden sein können. FreeConsole() tut aber seinen Job hervorragend, da es eh nur eine Konsole (pro Prozeß) geben kann
... sonst würde ja
AllocConsole() das
Handle zu einer beliebigen neu erzeugten Konsole zurückliefern und nicht nur Erfolg oder Mißerfolg
Ab Windows XP gibt's noch
AttachConsole(), welches dem o.g. Ziel (wenn dies denn deines ist) durchaus helfen könnte. Ich werde mir das mal im Disassembler angucken und vielleicht mit einer Lösung auch ab NT4 rüberrücken. Aber
Win9x-Kompat. kannste da definitiv knicken.
Nachtrag: Ich habe es mir gerade angeguckt. Es hängt doch einiges mehr dran. Das größte Problem aber sind die Client/Server-Nachrichten (CSR-Messages), welche nunmal leider nicht dokumentiert sind. Wenn du eine CSR auf Windows 2000 mit einer bestimmten ID zum Laufen bekommen hast, kannst du dir auf Windows XP damit gut und gerne Hardware zerschiessen. Ist also nix wirklich kompatibles. Zumal fraglich ist, ob diese spezifische CSR schon in Windows 2000 existieren würde. Ich werde es mal demnächst versuchen, könnte ja sein, daß es auch ohne die geht. Aber wer weiß :-/