Uruchomienie i sterowanie aplikacją konsolową.

0

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ę :).

0

słowo-klucz: named pipe

0

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)

0

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]

0

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

  1. DefaultWindowState := FALSE //Inaczej to co ustawimy w WindowState nie będzie miało znaczenia.
  2. 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.

0

Chodzi o to że Klikasz start, wszystkie programy, cmd, enter. i Tam sobie grasz? A nie lepiej napisać w pascalu aplikację okienkową?

0

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.

0

Czyli zrobiłeś tak jak Ci podpowiadałem ;]
Pozdrawiam.

0

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

0

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 World

Choose 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 :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1