stdin/stdout im eigenen Prozess verbiegen

04/10/2008 - 19:27 von R.-Erik Ebert | Report spam
Hallo NG,

kann man in eine Windows.Forms-Anwendung code, der stdin/stdout benutzt so
einbinden, dass beide irgendwie in Fenster umgeleitet werden?

Etwas genauer:

Ich will eine Bibliothek benutzen, die per P/Invoke eingebunden wird.
Innerhalb dieser Bibliothek gibt es Funktionen, die die Standardein- bzw.
Ausgabe benutzen. Ein einfacher Weg ist es, eine Konsolenanwendung zu
basteln, sie eben im main das übliche Application.Run(myForm) aufruft. Das
ist aber nicht schön, weil dann das Konsolenfenster neben der übrigen
Anwendung liegt (es einzusperren ist mir nicht gelungen).
Der Weg Console.SetOut/In mit überschriebenem TextReader/Writer geht auch
nicht. Dann landen zwar z.B. Console.Write-Ausgaben in meinem Fenster, nicht
aber die der Bibliotheksfunktionen.

Weiß jemand Rat?

Danke
Erik
 

Lesen sie die antworten

#1 Kerem Gümrükcü
05/10/2008 - 09:52 | Warnen spam
Hallo Erik,

man kann zwar den STD_HANDLE umleiten, aber wie
wàre es mit einer Möglichkeit, beim Startvorgang deines
Programmes eine Konsole zu erzeugen, die dann ganz
einfach aus deinem Programm mit Console.Write(Line)
und der ganzen Console-Klasse bearbeitet werden kann.
Das mache ich immer bevorzugt. Du erzeugst am besten
die Konsole noch am Anfang deiner Main-Methode bevor
du das Haupt-Form startest. Hier habe ich auch fertige
Funktionen für dich:

[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool AllocConsole();

[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool FreeConsole();

[DllImport("kernel32.dll", SetLastError = true, CharSet=CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetConsoleTitle(string lpConsoleTitle);

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern uint GetConsoleTitle([Out] StringBuilder lpConsoleTitle,
uint nSize);

[DllImport("kernel32.dll")]
public static extern IntPtr GetConsoleWindow();

[DllImport("kernel32.dll", SetLastError = true)]
public static extern Int32 SetConsoleIcon(IntPtr IconHandle);
//undokumentiert!

Viele professionelle Projekte arbeiten so, wie z.B. Wireshark
und auch meine Programme. Du gehst so vor:

AllocConsole() //erzeuge hauptkonsole
SetConsoleIcon() //àndere konsolenicon auf ein gewünschtes, z.b deines
programmes
SetConsoleTitle()//àndere den titel der konsole
...

und kurz vor dem beenden machst Du:
FreeConsole() //schliesse konsole

Viel Erfolg!

Grüße

Kerem

Beste Grüsse / Best regards / Votre bien devoue
Kerem Gümrükcü
Latest Project: http://www.codeplex.com/restarts
Latest Open-Source Projects: http://entwicklung.junetz.de
"This reply is provided as is, without warranty express or implied."

Ähnliche fragen