![]() |
CreateProcess Zugriff verweigert
Hallo,
Ich habe bereits mehrfach die Hilfe in diesem Forum benutzt jedoch hilft mir bisher kein Post wirklich weiter. Mein Programm startet nacheinander unterschiedliche "Dienste" via CreateProcess:
Delphi-Quellcode:
GetStartupInfo(StartupInfo);
StartupInfo.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW; StartupInfo.wShowWindow := SW_HIDE; // SW_SHOWNORMAL; StartupInfo.hStdOutput := NewStdOut; StartupInfo.hStdError := NewStdOut; StartupInfo.hStdInput := NewStdIn;
Delphi-Quellcode:
in strDummy steht die auszuführende Zeile einer Batchdatei. Das kann z.B. sein:
if not CreateProcess(
nil, //PChar(CommandLine), PChar(strDummy), nil, nil, True, ProPri, // and CREATE_NEW_CONSOLE, nil, nil, StartupInfo, ProcessInfo) then begin LogDlg.AddToKonsoleLog('nach CreateProcess Close Handle'); // CloseHandle(NewStdIn); // CloseHandle(NewStdOut); // CloseHandle(ReadStdOut); // CloseHandle(WriteStdIn); LogDlg.AddToKonsoleLog('Win32 Error recieved'+ SysErrorMessage(GetLastError));
Delphi-Quellcode:
Jetzt kommt bei der Ausführung des del-Befehls immer Zugriff verweigert(sehe ich durch GetLastError) und ich weiß nicht warum?!
del C:\Software\sw\report_detail.pdf
copy C:\Software\sw\report.xml C:\Software\sw\protocol.xml C:\Software\sw\help_program.exe Führe ich den del Befehl in der Console aus dann funktioniert er einwandfrei. Die zu löschende Datei wird dann auch gelöscht, wenn ich es über createprocess starte dann tut der "DEL" nichts :-( Ich nutze deshalb createprocess weil ein eigener Prozess erzeugt wird und meine GUI weiterhin bedienbar ist. Außerdem soll der Ablauf auch ohne GUI funktionieren (also das reine Ausführen der Batch Datei). Ich hoffe ich habe euch alle relevanten Daten gegeben und ihr könnt mir weiterhelfen. Verwandte Themen habe ich bereits durchsucht: ![]() ![]() Danke und schöne Grüße Andi |
Re: CreateProcess Zugriff verweigert
Erstens: Kann es sein, dass im Pfad ein Leerzeichen enthalten ist und du keine Anführungszeichen verwendet hast?
Zweitens: Nur weil deine Oberfläche noch bedienbar bleiben soll brauchst du keine externe Batchdatei. Ein Thread wäre bspw. auch möglich. |
Re: CreateProcess Zugriff verweigert
Zu Erstens:
Der Pfad enthält keine Leerzeichen und die Zeile der Batchdatei ist ja auch wenn ich es manuell in der Console eintippe funktionsfähig. Zu Zweitens: Stimmt, wenn es also eine Alternative zu CreateProcess gibt bin ich da auch offen (Shellexecute hatte ich in erwägung gezogen aber da bekomme ich denke ich kein Feedback über den Exitstatus der exe die ich gestartet habe oder?) |
Re: CreateProcess Zugriff verweigert
Hallo,
vermutlich machst Du einen kleinen Denkfehler. In der DOS-Console läuft bereits eine CMD.EXE, die del und copy (als interne Befehle) interpretieren kann. Wenn Du einen neuen Prozess erstellst, so muss der ein ausführbares Programm sein. Del und Copy gehören nicht dazu. D. H.: Um Del und Copy auszuführen, musst Du eine CMD.EXE mit del bzw. copy als Parameter ausführen. Das könnte in etwa so aussehen:
Delphi-Quellcode:
strDummy := 'cmd.exe /c del "C:\Software\sw\report_detail.pdf"';
|
Re: CreateProcess Zugriff verweigert
Ach stimmt, dann hatte ich das falsch verstanden, ich dachte eine Batchdatei würde gestartet mit diesen Befehlen. Aber was bringt denn sowas im Vergleich zu den Befehlen in Delphi selbst? :shock:
|
Re: CreateProcess Zugriff verweigert
Achja, tatsächlich ein Denkfehler.
Ich werde nun den String auswerten der CreateProcess übergeben wird. Wenn ein "del" oder "copy" drinnen ist mache ich keinen umweg über createprocess sondern nutze DeleteFile bzw die Copy Funktion in Delphi. Zitat:
Der Ablauf und die Reihenfolge der Commandos kann sich ändern daher muss man sie in einem File speichern. XML wäre zwar möglich jedoch ist es eine Anforderung an mein "Programm-Paket", dass die "Ablaufscripte" auch ausführbar sind selbst wenn mein Programm nicht auf dem Rechner installiert ist. Mein Programm bietet nur eine Benutzerfreundliche GUI an um die Batchdatei anzupassen und die Exitcodes der gestarteten Executables auszuwerten. Schöne Grüße Andi |
Re: CreateProcess Zugriff verweigert
Hallo,
Zitat:
Zitat:
Alternativ könnte man hier sicherlich auch hergehen, eine Batchdatei zu erstellen und diese dann mit
Delphi-Quellcode:
aufzurufen. Hier muss dann nur noch ein Prozess erstellt werden und alle Möglichkeiten von Batchdateien blieben erhalten.
strDummy := 'cmd.exe /c c:\Pfad\MeineBatchDatei.Bat';
|
Re: CreateProcess Zugriff verweigert
Danke für die Hilfe,
Die Batch als einen einzigen Prozess zu starten funktioniert bei mir leider nicht da ich die Exitcodes der gestarteten exe-Files auswerten muss.
Delphi-Quellcode:
Mich interessieren jeweils die exitcodes von help_program.exe und help_program2.exe. Würde ich einen einzigen Prozess starten bekomme ich nicht mit wann eine exe fertig ist und wann eine neue startet.
del C:\Software\sw\report_detail.pdf
copy C:\Software\sw\report.xml C:\Software\sw\protocol.xml C:\Software\sw\help_program.exe del C:\Software\sw\report_detail2.pdf copy C:\Software\sw\report.xml C:\Software\sw\protocol2.xml C:\Software\sw\help_program2.exe ich habe mein Problem mit den Shell-Bultin-Commands nun wie folgt gelöst:
Delphi-Quellcode:
Nun wird nur ein eigener Prozess gestartet wenn tatsächlich eine exe gestartet wird. Ich hoffe das ist nun auch performanter.
starti := Pos('del ', strDummy);
if starti = 1 then begin //del befehl gefunden, nun comandlineString "zerschneiden" strConcat := Copy(strDummy, 5,Length(strDummy)); if(FileExists(strConcat))then DeleteFile(strConcat); end else if ( Pos('copy ', strDummy) = 1) then begin //copy befehl gefunden, nun comandlineString "zerschneiden" um source und destination zu erhalten strConcat := Copy(strDummy, 6,Length(strDummy)); strConcatSource := Copy(strConcat, 0,(Pos(' ',strConcat))-1); strConcatDestination := Copy(strConcat, (Pos(' ',strConcat))+1,Length(strConcat)); if(FileExists(strConcatSource))then CopyFile(PChar(strConcatSource),PChar(strConcatDestination),False); end else if not CreateProcess( nil, //PChar(CommandLine), PChar(strDummy), nil, nil, True, ProPri, // and CREATE_NEW_CONSOLE, nil, nil, StartupInfo, ProcessInfo) then begin Darauf, dass ich die del und copy nicht über createprocess aufrufen kann ohne "cmd" davor zu schreiben wär ich nie gekommen. Merci ! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:22 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-2025 by Thomas Breitkreuz