AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

key an console senden

Ein Thema von moin339 · begonnen am 2. Aug 2003 · letzter Beitrag vom 3. Aug 2003
Antwort Antwort
Benutzerbild von moin339
moin339

Registriert seit: 23. Sep 2002
Ort: Hamburg
136 Beiträge
 
#1

key an console senden

  Alt 2. Aug 2003, 23:42
Moin!
Ich probiere gerade ein consolen programm von meinem delphi-programm aus zu steuern. Die Ausgaben des consolenprgramms kann ich problemlos auslesen und ausgeben aber ich schaffe es nicht tasten an das consolen programm zu senden. Könnt ihr euch mal bitte meinen code ansehen. ich vestehe einfach nicht warum es nicht funktioniert. Theoretisch müsste ein 'n' an die console gesendet werden wenn ich auf button1 klicke.

Hier der CODE:

Delphi-Quellcode:
procedure MyNew(const Filename, Parameter: string);
var
  CommandLine : string;
  si : STARTUPINFO;
  pi : PROCESS_INFORMATION;
  sa : SECURITY_ATTRIBUTES;
  newstdout : THandle;
  write_stdin : THandle;
  read_stdout : THandle;
  Output : string;
  buffer : array[0..1023] of char;
  ExitCode : cardinal;

  procedure CorrectCRLF(var s: string); // macht aus CR: CR + LF
  begin
    s := StringReplace(s, char($0D), char($0D) + char($0A), [rfReplaceAll]);
    s := StringReplace(s, char($0D) + char($0A) + char($0A), char($0D) + char($0A), [rfReplaceAll]);
  end;

  procedure ZeroBuffer(var buffer2clear: array of char);
  begin
    FillChar(buffer2clear, SizeOf(buffer2clear), 0);
  end;

  procedure GetData;
  var
    bytes_read : cardinal;
    bytes_available : cardinal;
  begin
    PeekNamedPipe(read_stdout, @buffer, sizeof(buffer), @bytes_read, @bytes_available, NIL);
    if bytes_read > 0 then
    begin
      ZeroBuffer(buffer);
      if (bytes_available > sizeof(buffer)) then
      begin
        while (bytes_read >= sizeof(buffer)) do
        begin
          ReadFile(read_stdout, buffer, sizeof(buffer), bytes_read, NIL);
          Output := Output + buffer;
          CorrectCRLF(Output);
          ZeroBuffer(buffer);
        end;
      end
      else
      begin
        ReadFile(read_stdout, buffer, sizeof(buffer), bytes_read, NIL);
        Output := Output + buffer;
        CorrectCRLF(Output);
      end;
    end;
  end;
begin
  CommandLine := '"' + Filename + '" ' + Parameter;
  GetStartupInfo(si);

  sa.nLength := SizeOf(sa);
  sa.lpSecurityDescriptor := nil;
  sa.bInheritHandle := true;
  CreatePipe(read_stdout, newstdout, @sa, 0);
  CreatePipe(write_stdin, newstdin, @sa, 0);

  si.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
  si.wShowWindow := SW_SHOW;
  si.hStdOutput := newstdout;
  si.hStdError := newstdout;
  si.hStdInput := write_stdin;
    
  if not (CreateProcess(NIL, PChar(CommandLine), NIL, NIL, TRUE, CREATE_NEW_CONSOLE, NIL, NIL, si, pi)) then
  begin
    CloseHandle(newstdout);
    CloseHandle(read_stdout);
    CloseHandle(newstdin);
    CloseHandle(write_stdin);
    SM('Fehler bei CreateProcess: ' + inttostr(GetLastError));
  end;

  GetExitCodeProcess(pi.hProcess, ExitCode);
  while ExitCode = STILL_ACTIVE do
  begin
    Application.ProcessMessages;
    GetData;
    GetExitCodeProcess(pi.hProcess, ExitCode);
    MainForm.Memo1.Text := Output;
  end;
  GetData;
  MainForm.Memo1.Text := Output;
  CloseHandle(newstdout);
  CloseHandle(read_stdout);
  CloseHandle(newstdin);
  CloseHandle(write_stdin);
end;

procedure TMainForm.Button1Click(Sender: TObject);
var
  buffer : char;
  bytes_written : cardinal;
begin
  buffer := 'n';
  WriteFile(newstdin, buffer, sizeof(buffer), bytes_written, nil);
end;
Danke schon mal im Vorraus
moin339
  Mit Zitat antworten Zitat
Benutzerbild von moin339
moin339

Registriert seit: 23. Sep 2002
Ort: Hamburg
136 Beiträge
 
#2

Re: key an console senden

  Alt 3. Aug 2003, 21:49
Problem hat sich erledigt. Das consolen programm, das ich steuern möchgte, ließt die Eingaben anders aus. Der code funktioniert wunderbar bei anderen consolen-programmen.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz