Registriert seit: 16. Sep 2010
37 Beiträge
|
Delphi + Kommandozeile, Kernel32.dll Fehler
15. Apr 2013, 16:09
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:
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;
Mitgeliefert wurde ein Bsp:
Delphi-Quellcode:
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;
Beim ausführen erhalte ich jedes mal folgende Fehlermeldung:
Screenshot der Fehlermeldung
Wenn man den Debugger ausführt sieht man, dass das Programm an folgender Stelle hält:
Delphi-Quellcode:
if CreateProcess(nil, PChar(Command), nil, nil, True, CreationFlags, nil, nil,
StartupInfo, ProcessInfo) then
Nun meine Frage: Wieso?
Danke im vorraus.
Geändert von torro (15. Apr 2013 um 16:11 Uhr)
|