AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

CreateProcess Zugriff verweigert

Ein Thema von aegidos · begonnen am 18. Feb 2009 · letzter Beitrag vom 18. Feb 2009
Antwort Antwort
aegidos

Registriert seit: 30. Okt 2007
40 Beiträge
 
Delphi 2007 Professional
 
#1

CreateProcess Zugriff verweigert

  Alt 18. Feb 2009, 06:48
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
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.347 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: CreateProcess Zugriff verweigert

  Alt 18. Feb 2009, 06:55
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
aegidos

Registriert seit: 30. Okt 2007
40 Beiträge
 
Delphi 2007 Professional
 
#3

Re: CreateProcess Zugriff verweigert

  Alt 18. Feb 2009, 07:01
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?)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

Re: CreateProcess Zugriff verweigert

  Alt 18. Feb 2009, 07:55
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:

strDummy := 'cmd.exe /c del "C:\Software\sw\report_detail.pdf"';
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.347 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: CreateProcess Zugriff verweigert

  Alt 18. Feb 2009, 08:04
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?
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
aegidos

Registriert seit: 30. Okt 2007
40 Beiträge
 
Delphi 2007 Professional
 
#6

Re: CreateProcess Zugriff verweigert

  Alt 18. Feb 2009, 08:17
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
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

Re: CreateProcess Zugriff verweigert

  Alt 18. Feb 2009, 08:20
Hallo,
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?
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 mitstrDummy := '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.
  Mit Zitat antworten Zitat
aegidos

Registriert seit: 30. Okt 2007
40 Beiträge
 
Delphi 2007 Professional
 
#8

Re: CreateProcess Zugriff verweigert

  Alt 18. Feb 2009, 09:23
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 !
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:45 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