Delphi + Kommandozeile, Kernel32.dll Fehler
Hi,
ich versuche gerade aus meinem Delphi Programm heraus ein Pythonscript zu starten und zu steuern. Um über die CMD mit dem script zu kommunizieren habe ich fertigen Code gefunden (ja ich habe cmd auch mal durch comman.con ausgetauscht). Ziel ist es ein Pythonscript im interaktiven Modus von meinem Programm zu steuern.
Delphi-Quellcode:
Mitgeliefert wurde ein Bsp:
function GetConsoleOutput(const Command: string;
Output, Errors: TStringList): Boolean; var Buffer: array [0 .. 255] of Char; CreationFlags: DWORD; NumberOfBytesRead: DWORD; PipeErrorsRead: THandle; PipeErrorsWrite: THandle; PipeOutputRead: THandle; PipeOutputWrite: THandle; ProcessInfo: TProcessInformation; SecurityAttr: TSecurityAttributes; StartupInfo: TStartupInfo; Stream: TMemoryStream; begin // Initialisierung ProcessInfo FillChar(ProcessInfo, SizeOf(TProcessInformation), 0); // Initialisierung SecurityAttr FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0); SecurityAttr.nLength := SizeOf(TSecurityAttributes); SecurityAttr.bInheritHandle := True; SecurityAttr.lpSecurityDescriptor := nil; // Pipes erzeugen CreatePipe(PipeOutputRead, PipeOutputWrite, @SecurityAttr, 0); CreatePipe(PipeErrorsRead, PipeErrorsWrite, @SecurityAttr, 0); // Initialisierung StartupInfo FillChar(StartupInfo, SizeOf(TStartupInfo), 0); StartupInfo.cb := SizeOf(TStartupInfo); StartupInfo.hStdInput := 0; StartupInfo.hStdOutput := PipeOutputWrite; StartupInfo.hStdError := PipeErrorsWrite; StartupInfo.wShowWindow := SW_HIDE; StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; CreationFlags := CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS; if CreateProcess(nil, PChar(Command), nil, nil, True, CreationFlags, nil, nil, StartupInfo, ProcessInfo) then // Debugger hält hier begin Result := True; // Write-Pipes schließen CloseHandle(PipeOutputWrite); CloseHandle(PipeErrorsWrite); // Ausgabe Read-Pipe auslesen Stream := TMemoryStream.Create; try while ReadFile(PipeOutputRead, Buffer, 255, NumberOfBytesRead, nil) do begin Stream.Write(Buffer, NumberOfBytesRead); end; Stream.Position := 0; Output.LoadFromStream(Stream); finally Stream.Free; end; CloseHandle(PipeOutputRead); // Fehler Read-Pipe auslesen Stream := TMemoryStream.Create; try while ReadFile(PipeErrorsRead, Buffer, 255, NumberOfBytesRead, nil) do begin Stream.Write(Buffer, NumberOfBytesRead); end; Stream.Position := 0; Errors.LoadFromStream(Stream); finally Stream.Free; end; CloseHandle(PipeErrorsRead); WaitForSingleObject(ProcessInfo.hProcess, INFINITE); CloseHandle(ProcessInfo.hProcess); end else begin Result := False; CloseHandle(PipeOutputRead); CloseHandle(PipeOutputWrite); CloseHandle(PipeErrorsRead); CloseHandle(PipeErrorsWrite); end; end;
Delphi-Quellcode:
Beim ausführen erhalte ich jedes mal folgende Fehlermeldung:
procedure TForm1.Button1Click(Sender: TObject);
var Output : TStringList; Errors : TStringList; begin Output := TStringList.Create; Errors := TStringList.Create; try if GetConsoleOutput('cmd /c dir c:', Output, Errors) then Memo1.Lines.AddStrings(Output); finally Output.free; Errors.free; end; end; Screenshot der Fehlermeldung Wenn man den Debugger ausführt sieht man, dass das Programm an folgender Stelle hält:
Delphi-Quellcode:
Nun meine Frage: Wieso?
if CreateProcess(nil, PChar(Command), nil, nil, True, CreationFlags, nil, nil,
StartupInfo, ProcessInfo) then Danke im vorraus. |
AW: Delphi + Kommandozeile, Kernel32.dll Fehler
Kann Closed werden / gelöscht werden.
|
AW: Delphi + Kommandozeile, Kernel32.dll Fehler
Und wieso sollten wir das Löschen?
Hast du es gelöst? Teilst du uns auch mit was du falsch gemacht hast? |
AW: Delphi + Kommandozeile, Kernel32.dll Fehler
Und woran lag es? Vielleicht hat jemand anderes dieses Problem ja auch einmal und ist an der Lösung interessiert.
[edit] Roter Kasten, wo bist Du? @Bernhard: :cheers: [/edit] |
AW: Delphi + Kommandozeile, Kernel32.dll Fehler
Interessant wäre jetzt der Wert von
Delphi-Quellcode:
und der Inhalt der entsprechenden Strukturen für
Command
Delphi-Quellcode:
gewesen...
CreateProcess
|
AW: Delphi + Kommandozeile, Kernel32.dll Fehler
Hier war schon mal so ein Problem mit Lösung, vielleicht hilfts dir ja auch:
http://www.delphipraxis.net/168425-a...teprocess.html |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:47 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