Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi key an console senden (https://www.delphipraxis.net/7125-key-console-senden.html)

moin339 3. Aug 2003 00:42


key an console senden
 
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 :?:

moin339 3. Aug 2003 22:49

Re: key an console senden
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz