Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi CreateProcess Zugriff verweigert (https://www.delphipraxis.net/129385-createprocess-zugriff-verweigert.html)

aegidos 18. Feb 2009 06:48


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:
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));
in strDummy steht die auszuführende Zeile einer Batchdatei. Das kann z.B. sein:
Delphi-Quellcode:
del C:\Software\sw\report_detail.pdf
copy C:\Software\sw\report.xml C:\Software\sw\protocol.xml
C:\Software\sw\help_program.exe
Jetzt kommt bei der Ausführung des del-Befehls immer Zugriff verweigert(sehe ich durch GetLastError) und ich weiß nicht warum?!
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:
http://www.delphipraxis.net/internal...=createprocess
http://www.delphipraxis.net/internal...igert&start=30

Danke und schöne Grüße
Andi

jaenicke 18. Feb 2009 06:55

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.

aegidos 18. Feb 2009 07:01

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?)

nahpets 18. Feb 2009 07:55

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"';

jaenicke 18. Feb 2009 08:04

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:

aegidos 18. Feb 2009 08:17

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:

Aber was bringt denn sowas im Vergleich zu den Befehlen in Delphi selbst?
Der Vorteil:
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

nahpets 18. Feb 2009 08:20

Re: CreateProcess Zugriff verweigert
 
Hallo,
Zitat:

Zitat von jaenicke
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:

zuerst hatte ich auch gedacht, es wird eine Batchdatei gestartet, beim wiederholten Nachlesen viel mir dann das auf:
Zitat:

in strDummy steht die auszuführende Zeile einer Batchdatei. Das kann z.B. sein:
Delphi-Quellcode:
del C:\Software\sw\report_detail.pdf
copy C:\Software\sw\report.xml C:\Software\sw\protocol.xml
C:\Software\sw\help_program.exe

Hier wird also quasi ein eigener "Batchprozessor" gebaut, der die Zeilen einer Batchdatei abarbeitet. Hier muss dann für alle internen Befehle der CMD.EXE diese aufgerufen werden, da sie dem Betriebssystem selbst unbekannt sind und deshalb nicht als Prozess gestartet werden können.
Alternativ könnte man hier sicherlich auch hergehen, eine Batchdatei zu erstellen und diese dann mit
Delphi-Quellcode:
strDummy := 'cmd.exe /c c:\Pfad\MeineBatchDatei.Bat';
aufzurufen. Hier muss dann nur noch ein Prozess erstellt werden und alle Möglichkeiten von Batchdateien blieben erhalten.

aegidos 18. Feb 2009 09:23

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:
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
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.

ich habe mein Problem mit den Shell-Bultin-Commands nun wie folgt gelöst:
Delphi-Quellcode:
      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
Nun wird nur ein eigener Prozess gestartet wenn tatsächlich eine exe gestartet wird. Ich hoffe das ist nun auch performanter.

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 23:54 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