PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Konsolenanwendungen umleiten in anderes Fenster


Patrik Graf
04.03.2002, 08:31
Jo, ich würd gerne das was eine Konsolenanwendung ausgibt umleiten in ein anderes Fenster. Also z.B. den command.com Interpreter starten und umleiten in ne Textbox oder so. Ich habe gesucht und gesucht und .... aber nix gefunden. Vieleicht weiß einer von euch wie das geht. Ich galube nämlich ich suche nur am falschen Fleck...

Thanx :D


Mimo
04.03.2002, 12:55
Ist bestimmt net einfach! :D

Ich würde mal folgenden Weg einschlagen:

Umleitungen der Ausgaben sind generell von der Commandozeile ja nur mit ">" bzw. ">>" möglich.

Man kann eine Datei angeben aber auch z.B. den Parallelport, wenn man den Krams gleich aufn Drucker ausgeworfen haben will.

Nun würd ich mal versuchen per Proggi eine Pipe zu erzeugen und versuchen, dies in eine Pipe auszugeben.

Wobei hierfür eine Named Pipe erforderlich ist. Named-Pipe-Appz zu erstellen ist nicht unter Windows 95/98 möglich, wohl aber diese dort laufen zu lassen (magic, gell? hab ich mal in der msdn-lib gelesen).

Also quasi ein "Ausgabeproggi" schreiben, der sämtliche Sachen, die in die entspr. Pipe laufen, in eine textbox ausgibt.

Gruss,
Mimo

Patrik Graf
05.03.2002, 00:25
So, was mach ich falsch... ?( ist bestimmt nur ein Verständnisfehler, denke ich.

procedure TForm1.Button1Click(Sender: TObject);
Var PipeHandle: THandle;
InBuffer, OutBuffer: PChar;
BytesRead: Cardinal;
begin
Breakflag := False; InBuffer := ´´; OutBuffer := ´´;
PipeHandle := CreateNamedPipe(´\\.\pipe\grafitty´,
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_MESSAGE and PIPE_READMODE_MESSAGE and PIPE_WAIT,
1,
255,
255,
NMPWAIT_USE_DEFAULT_WAIT,
nil);
If PipeHandle = INVALID_HANDLE_VALUE Then begin
Memo1.Lines.Add(´Fehler beim erstellen der Pipe! FehlerCode(´+IntToStr(GetLastError)+´)´); Exit;
end;
ShellExecute(GetDesktopWindow,´open´,´e:\windows\system32\command.com´,´> \\.\pipe\grafitty´,´e:\windows\system32´,SW_HIDE);
Memo1.Lines.Add(´COMMAND.COM wurde gestartet mit Umleitung auf Pipe.´);
While not Breakflag Do begin
If not CallNamedPipe(´\\.\pipe\grafitty´,InBuffer,255,OutBuffer,255,BytesRead,NMPWAIT_NOWAIT) Then begin
Memo1.Lines.Add(´Es konnte nicht aus der Pipe gelesen werden. FehlerNr(´+IntToStr(GetLastError)+´)´); Exit;
end
Else If OutBuffer <> &acute;&acute; Then Memo1.Lines.Add(OutBuffer);
Application.ProcessMessages;
end;
end;

So, geht halt nicht. Er kann nich aus der Pipe lesen. Und das beste ist, Windows meldet, das alle Pipeinstanzen z.Z. ausgelastet sind.

Was jetzt? Zeigt mir wo der Fehler liegt... :D

Mimo
05.03.2002, 10:27
Also... ich hab mal PipeServer und Clients in C gecoded. Dort sah der Befehl woe folgt aus:

CPipeServer p(&quot;\\\\.\\pipe\\ComPorts&quot;, // name of pipe
FILE_FLAG_OVERLAPPED |
PIPE_ACCESS_DUPLEX, // pipe open mode
PIPE_TYPE_MESSAGE |
PIPE_READMODE_MESSAGE |
PIPE_WAIT, // pipe IO type
2, // number of instances
1024, // size of outbuff (0 == allocate as necessary)
1024, // size of inbuff
1000, // default time-out value
PipeProc); // Pipe-proc


(FILE_FLAG_OVERLAPPED je nach Bedarf)

Was mit aufgefallen ist...

Die Zeile:

PIPE_TYPE_MESSAGE and PIPE_READMODE_MESSAGE and PIPE_WAIT,

Müßte heissen:

PIPE_TYPE_MESSAGE or PIPE_READMODE_MESSAGE or PIPE_WAIT

denn wenn Du Flags verknüpfen willst, dann muss dies über eine ODER-Verknüpfung gehen. Bei einer UND-Verknüpfung könntest Du auch alle Flags gleich weglassen, da das Ergebnis 0 sein würde!

Gruss,
Mimo

Btw... hattest Du schon mal vorher gecheckt, ob es überhaupt möglich ist, Ausgaben in eine Pipe umzulenken?

Patrik Graf
05.03.2002, 13:27
Klar... :D ganz vergessen... :D mit AND hau ich die Bits raus... :rolleyes:

OR ist das Zauberwort... :D
Blöder Fehler, war gestern Nacht nich mehr so ganz wach :D

Thanx

Patrik Graf
06.03.2002, 00:45
Also, das umleiten in die Pipe funzt, aber aus der Pipe lesen klappt immer noch nicht. Ich meld mich wieder sobald das lesen auch klappt. :D

Mimo
06.03.2002, 17:27
Das klappt? Klasse!

War nämlich nur eine Vermutung, dass es geht, aber vom logischen sprach nix dagegen!

Was hast Du denn bei der Umleitung als File angegeben?

Der Pipename allein reicht ja sicher net...

Gruss,
Mimo

Patrik Graf
07.03.2002, 09:22
Ein File hab ich keins angegeben... nur den Namen der Pipe. Aber das könnte das Prob erklären, daß ich nicht aus der Pipe lesen kann... :D

Wenn das klappt, schreib ich ein Buch darüber... :D

Patrik Graf
05.04.2002, 08:10
Hiho!!! :D

Ich hab´s geschafft!!!! :D :D

Gestern Abend bin ich dahintergekommen wie´s geht. Poste die Lösung heute noch, aber nicht jetzt denn bin gerade @work. :D

Patrik Graf
06.04.2002, 22:35
So...

Downloaden könnt ihr den Source hier (http://www.grafitty.de/pipe.zip) :D

xOOn
07.04.2002, 12:07
ich hab mir den source mal kopiert!!
das glaub ich kann man immer mal gebrauchen :D :D :D
thx fuers posting

nj0y
17.04.2002, 14:32
Da möchte ich mich auch mal artig bedanken ;). Hab&acute;s zwar noch nicht angeschaut, aber schön archiviert :D.