Witam, chciałbym zrobić GUI dla serwera pewnej gry który jest w postaci aplikacji konsolowej, po uruchomieniu można w nim wydawać komendy. Chciałbym właśnie mieć możliwość po uruchomieniu serwera na wysyłanie i obieranie tekstu z okna jego konsoli, tak aby wydawać polecenia i odbierać ich wyniki. Np. dla zapisu mapy należy wydać polecenie /save i wcisnąć enter, chciałbym to zrobić poprzez wciśnięcie buttona w aplikacji okienkowej, a ona wysyłała by tekst do aplikacji-serwera. Dla jasności chodzi mi tylko o komunikację z aplikacją konsolową, z buttonami i całą resztą na prawdę sobie poradzę :).
słowo-klucz: named pipe
Możesz przechwycić strumienie wejścia, wyjścia. Z pamięci nie podam przykładu, ale myślę, że to jest szybkie i proste rozwiązanie jeżeli musisz się komunikować z aplikacją konsolową nie swojego autorstwa (domyślam się że tak jest)
Przedwcześnie się ucieszyłem na ten komponent. Wychodzą mi chińskie znaczki.
Memo1
楍牣獯景⁴楗摮睯坛牥橳⸶⸱㘷൝䌊灯特杩瑨⠠⥣㈠〰‹楍牣獯景⁴潃灲牯瑡潩圠穳汥楫牰睡慺瑳穲빥湯㩃啜敳獲䭜䭯屡敄歳潴屰敔牲牡慩敓癲牥啇㹉
Tak samo miałem z znalezioną w sieci procedurą znalezioną na tej stronie http://www.delphipages.com/forum/showthread.php?t=45001
Kod:
procedure TForm1.FormClick(Sender: TObject);
begin
ShowMessage('test');
Dos := TDosCommand.Create(Form1);
Dos.OutputLines := Memo1.Lines;
Dos.CommandLine := 'C:\Users\KoKa\Desktop\TerrariaServerGUI\terraria-server\terrariaserver.exe';
Dos.Execute;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Dos.Free;
end;
end.
Kolejną wskazówka, z tego w konsoli:
Microsoft Windows [Wersja 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Wszelkie prawa zastrzeżone.C:\Users\KoKa>
Wychodzą takie rzeczy w programie [ZNAK:Ord(ZNAK)]
[楍:26957][牣:29283][獯:29551][景:26223][⁴:8308][楗:26967][摮:25710][睯:30575][:8307][坛:22363][牥:29285][橳:27251][:8289][⸶:11830][⸱:11825][㘷:13879][:12592][൝:3421][䌊:17162][灯:28783][特:29305][杩:26473][瑨:29800][⠠:10272][⥣:10595][㈠:12832][〰:12336][‹:8249][楍:26957][牣:29283][獯:29551][景:26223][⁴:8308][潃:28483][灲:28786][牯:29295][瑡:29793][潩:28521][:11886][圠:22304][穳:31347][汥:27749][楫:26987][:8293][牰:29296][睡:30561][:8289][慺:24954][瑳:29811][穲:31346][빥:48741][湯:28271][:11877][:2573][:2573][㩃:14915][啜:21852][敳:25971][獲:29554][䭜:19292][䭯:19311][屡:23649][敄:25924][歳:27507][潴:28532][屰:23664][敔:25940][牲:29298][牡:29281][慩:24937][敓:25939][癲:30322][牥:29285][啇:21831][㹉:15945]
Rozwiązanie
Użyłem komponentu JvCreateProcess i wszystko działa (prawie, coś z polskimi znakami ale to mi nie potrzebne).
Wynik działania:
Microsoft Windows [Wersja 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Wszelkie prawa zastrzeľone.C:\Users\KoKa\Desktop\TerrariaServerGUI>echo żółć
żółćC:\Users\KoKa\Desktop\TerrariaServerGUI>
procedure TForm1.Button1Click(Sender: TObject);
begin
JvCreateProcess1.Run;
JvCreateProcess1.WriteLn('echo żółć');
end;
procedure TForm1.JvCreateProcess1Read(Sender: TObject; const S: string;
const StartsOnNewLine: Boolean);
begin
if(StartsOnNewLine) then Memo1.Lines.Add(S)
else Memo1.Text := Memo1.Text + S;
end;
Ustawienia komponentu w Object Inspector:
ConsoleOptions
coRedirect := TRUE //Inaczej nie dostaniemy wyjścia.
StartupInfo
- DefaultWindowState := FALSE //Inaczej to co ustawimy w WindowState nie będzie miało znaczenia.
- ShowWinow := swHide //Inaczej na ekranie pojawi się PUSTA konsola (pusta bo wyjście przekierowane jest na program.
To by było na tyle, dzięki za naprowadzenie na dobry trop.
Chodzi o to że Klikasz start, wszystkie programy, cmd, enter. i Tam sobie grasz? A nie lepiej napisać w pascalu aplikację okienkową?
O to, że klikam coś tam coś tam to nie wiem o czym mówisz a aplikacja okienkowa w pascalu? Przecież piszę w Delphi, a to jest obiektowy pascal, w turbo pascalu o ile wiem okienek nie ma. I chodzi o to, że ja piszę GUI dla tej aplikacji serwerowej Terrari.
Czyli zrobiłeś tak jak Ci podpowiadałem ;]
Pozdrawiam.
Chyba tak, nie wiem, ja tam pod pod postem napisałem z rozwiązaniem, on może być mało widoczny, ale opisane jest dokładnie co zrobiłem :P
Jednak z Terrarią tak się nie da i tu się kończy chyba przygoda z GUI do tej aplikacji bo:
Terraria Server v1.0.3
1 Tralalalala
n New World
d <number> Delete WorldChoose World:
Choose World:
WyjĄtek nieobsuľony: WyjĄtek nieobsuľony: System.IO.IOException: Nieprawidowe dojcie.
w System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
w System.Console.GetBufferInfo(Boolean throwOnNoConsole, Boolean& succeeded)
w System.Console.Clear()
w Terraria.Main.DedServ()
w Terraria.ProgramServer.Main(String[] args)
Edit: w wersji serwera 1.0.6 (chyba, wcześniejszej nie sprawdzałem) wszystko jest ok :)