konsola w memo

Odpowiedz Nowy wątek
2004-10-17 15:54

Rejestracja: 16 lat temu

Ostatnio: 6 lat temu

0

jak zrobić taki cfancyk żeby mieć konsole windowsową <XP [ win+r -> cmd ]> w memo i za pomocą edita wydawać polecenia do niej? Sam nie umiem tego wymyśleć to proszę nie o porady bo tyle to wiem ale o kod bo to jest największa trudność dla mnie w tym przypadku. [???]

Pozostało 580 znaków

nav
2004-10-17 16:07
nav

Rejestracja: 16 lat temu

Ostatnio: 1 miesiąc temu

Lokalizacja: Warszawa

0

adsylam do artykulow.

kod??
przcie to podstawy prawie.


utf-8 rlz! ٩(ಥ_ಥ)۶

Pozostało 580 znaków

2004-10-17 16:12

Rejestracja: 17 lat temu

Ostatnio: 14 lat temu

0

adsylam do artykulow

Ja notomiast odsyłam na Torry.net - widziałem tam kiedyś fajowy kodzik do obsługi konsoli w programie niekonsolowym


Pozostało 580 znaków

2004-10-18 16:08

Rejestracja: 17 lat temu

Ostatnio: 1 rok temu

0

no to ja zapodam mały kodzik do przechwytywania wyników z konsoli (czyli głowna rzecz jaka Ci jest potrzebna) resztę to już tylko i wyłącznie twoja inwencja... :D

function CaptureOutput( Parser: String ): String;
const
  LENBUFF = 255;
var
  tmp: String;
  hReadPipe, hWritePipe: THandle;
  sa: TSecurityAttributes;
  si: TStartupInfo;
  pi: TProcessInformation;
  lpBuffer: Array[0..LENBUFF] Of char;
  BytesRead: Cardinal;
  BytesToRead: Cardinal;
  rb: Boolean;
  Buffer: String;
  BufPos: Integer;
  FoundNewLine: Boolean;
  output_line: String;
  E: Exception;
begin
  sa.nLength := sizeof( sa );
  sa.lpSecurityDescriptor := nil;
  sa.bInheritHandle := TRUE;
  If Not CreatePipe( hReadPipe, hWritePipe, @sa, 0 ) Then
  Begin
    E := Exception.Create('Error creation Pipe');
    Raise E;
    E.Free;
    Exit;
  End;
  FillChar( si, sizeof(si), 0 );
  si.cb := sizeof( si );
  si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
  si.wShowWindow := SW_HIDE;
  si.hStdInput := 0;
  si.hStdOutput := hWritePipe;
  si.hStdError := hWritePipe;
  If Not CreateProcess( nil, pChar( parser ), nil, nil, true, 0, nil, nil, si, pi ) Then
  Begin
    E := Exception.Create('Error executing command');
    Raise E;
    E.Free;
    Exit;
  End;
  CloseHandle( hWritePipe );
  BytesToRead := LENBUFF;
  BytesRead := 0;
  Buffer := '';
  While ( True ) Do
  Begin
    lpBuffer := '';
    rb := ReadFile( hReadPipe, lpBuffer, BytesToRead, BytesRead, nil );
    If ( Not rb ) Then
      If ( length( Buffer ) = 0 ) Then Break;
    Buffer := Buffer + lpBuffer;
    foundNewLine := False;
    BufPos := Pos( #13, Buffer);
    If ( BufPos > 0 ) Then
    begin
      foundNewLine := True;
      output_line := Copy( Buffer, 1, BufPos-1 );
      // Here you have in output_line, the console output line by line.
      tmp := tmp + output_line;
      // shift remainder of buffer down
      Buffer := Copy( Buffer, BufPos+2, LENBUFF );
      BytesToRead   := LENBUFF - Length( Buffer );
    End Else
    Begin
      BytesToRead   := LENBUFF;
      tmp := tmp + Buffer;
      Buffer := '';
    End;
    If not foundNewLine Then
    Begin
      If ( BytesRead = LENBUFF ) Then
      Begin
        E := Exception.Create('Long line. Increase buffer length');
        Raise E;
        E.Free;
      End Else
        BytesToRead   := LENBUFF - Length( Buffer );
    End;
  End;
  WaitForSingleObject( pi.hProcess, INFINITE );
  CloseHandle( pi.hProcess );
  CloseHandle( hReadPipe );
  Result := tmp;
end;

kod wygooglowany po iluś tam godzinach szukania...

Pozostało 580 znaków

Odpowiedz

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