![]() |
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:
Danke schon mal im Vorraus
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; :?: moin339 :?: |
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