CreateProcess/system aber wie?



  • möchte einefach eine Batch-Datei starten, die sich aber nicht in dem Verzeichnis des Programms befindet, welches die Datei ausführt.
    Ich hab das mit "system("C:\\Programme\\xampp\\setup_xampp.bat")" ausprobiert, geht aber nicht. Wenn ich das in die eingabekonsole (cmd) eingebe, bekomme ich genau den gleichen fehler. Werden die Befehle von system so ausgewertet, als ob ich sie nacheinander in die cmd hineinschreibe?
    Weil wenn ich erst den Pfad in die cmd reinschreibe und dann den Namen der bat-datei funktioniert es.

    Oder soll ich da lieber CreateProcess verwenden? Da weis ich aber überhaupt nicht wie ich das anstellen soll.
    Der Pfad "C:\\Programme\\xampp\\setup_xampp.bat" soll aufgerufen werden (so, als ob ich es mit windows aus dem explorer raus aufrufe). Wenn sich danach das konsolenfenster geschlossen hat, soll eine weiter bat-Datei aufgerufen werden (Pfad:"C:\\Programme\\xampp\\apache\\apache_installservice.bat"). Und erst, wenn diese sich geschlossen hat, soll das C++-Programm weiterlaufen.

    Bitte um schnelle Antwort mit Quelltext.
    thx



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hab mal bei msdn nachgeguckt, werd daraus aber überhaupt nicht schlau.


  • Mod

    Bocky< schrieb:
    möchte einefach eine Batch-Datei starten, die sich aber nicht in dem Verzeichnis des Programms befindet, welches die Datei ausführt.
    Ich hab das mit "system("C:\\Programme\\xampp\\setup_xampp.bat")" ausprobiert, geht aber nicht. Wenn ich das in die eingabekonsole (cmd) eingebe, bekomme ich genau den gleichen fehler. Werden die Befehle von system so ausgewertet, als ob ich sie nacheinander in die cmd hineinschreibe?

    Und was bekommst Du für einen Fehler?
    Und ja. Eine BAT Datei macht nichts anderes als die Befehle Zeile für Zeile auszuführen!



  • Der Fehler ist:

    Sorry...cannot find php cli!
    Must abourt these process!
    Dücken Sie eine beliebige Taste...
    

    Er wird von der bat-Datei ausgegeben. Wenn ich die Datei aber mit doppelklick ausführe, bekomme ich keinen Fehler.

    Und ja. Eine BAT Datei macht nichts anderes als die Befehle Zeile für Zeile auszuführen!

    Ich meine nicht, was die Bat-Datei macht, sondern, wenn ich in die konsole einen Befehl eingebe, und dann noch einen und noch einen, ob die Funktion "system()" die Befehle genauso ausführt.
    Also ist:

    system("cd Programme");
    system("cd xampp");
    

    das gleiche wie, wenn ich in die Konsole erst:

    cd Programme
    

    und dann

    cd xampp
    

    eingebe??

    Und eigentlich wollte ich halt wissen, wie ich mit CreateProcess() die Dateien direkt aufrufe, da ich weis, dass diese Funktion dies genauso tut, wie ich es mit einem doppelklick mache.


  • Mod

    Das Ausführen von hintereinander gesetzten internen CMD Befehlen ist bei weitem nicht das selbe wie wenn diese innerhalb einer Batch Datei ausgeführt werden. Durch system wird ein neuer Prozess gestartet und dieser endet. Dann kommst Du und startest einen neuen Prozess. Aber die Infos über das Current Working Directory, dass durch CD geändert wird geht im Prinzip nach dem system Befehl durch das Ende des Prozesses verloren!



  • Dann muss ich CreateProcess verwenden. aber ich werd aus diesen syntaxdingern nicht schlau.

    Deshalb brauche ich am besten ein bisschen Code. Was der tun soll hab ich ja schon im erstenm post geschreiben.



  • Reicht Dir die Doku zu "CreateProcess" mit seinen diversen Links nicht aus?
    http://msdn2.microsoft.com/en-us/library/ms682425.aspx
    http://msdn2.microsoft.com/en-us/library/ms682512.aspx


  • Mod

    Bocky< schrieb:
    Dann muss ich CreateProcess verwenden. aber ich werd aus diesen syntaxdingern nicht schlau.

    Deshalb brauche ich am besten ein bisschen Code. Was der tun soll hab ich ja schon im erstenm post geschreiben.

    Das macht für den Befehl CD gar keinen unterschied. Vor allem würde CD mit CreateProcess gar nicht funktionieren, denn CD ist ein interner CMD.EXE Befehl und kein eigenständiges Programm.

    Was hast Du eigentlich vor? Ich finde Deine Anfrage etwas verworren.



  • Ich will auch nicht cd in createprocess verwenden, sondern einfach nur eine bat-datei mit createprocess aufrufen und wenn die bat-datei fertig ist, soll eine weitere bat-Datei aufgerufen werden, und wenn diese fertig ist, soll das Programm weiterlaufen.

    Hab nochma alles durchgelesen und so gut wie möglich übersetzt.

    String datei_pfad1;
    String pfad1;
    String datei_pfad2;
    String pfad2;
    String edit1_text = Edit1->Text;
    
    datei_pfad1 = edit1_text + "\\setup_xampp.bat";
    pfad1 = edit1_text;
    datei_pfad2 = edit1_text + "\\apache\\apache_installservice.bat";
    pfad2 = edit1_text + "\\apache\\";
    
    STARTUPINFO si1;
    PROCESS_INFORMATION pi1;
    ZeroMemory( &si1, sizeof(si1) );
    si1.cb = sizeof(si1);
    ZeroMemory( &pi1, sizeof(pi1) );
    CreateProcess(datei_pfad1.c_str(),NULL,NULL,NULL,false,0,NULL,pfad1.c_str(),&si1,&pi1);
    WaitForSingleObject( pi1.hProcess, INFINITE );
    
    STARTUPINFO si2;
    PROCESS_INFORMATION pi2;
    ZeroMemory( &si2, sizeof(si2) );
    si2.cb = sizeof(si2);
    ZeroMemory( &pi2, sizeof(pi2) );
    CreateProcess(datei_pfad2.c_str(),NULL,NULL,NULL,false,0,NULL,pfad2.c_str(),&si2,&pi2);
    WaitForSingleObject( pi2.hProcess, INFINITE );
    
    Application->MessageBox("Erfolgreiche Ausführung des Programms","Fertig",64);
    

    So funktioniert's!!

    😃 😃 😃 Danke!Danke!Danke!Danke!Danke!Danke!Danke!Danke! 😃 😃 😃



  • Zu früh gefreut:

    Wenn ich das Programm von einer Festplatte starte, funktioniert es korrekt.
    Ich hab es dann aber auf eine CD gebrannt - und es funktioniert nicht mehr.
    Die Bat-Datei findet irgenwelche Dateien nicht mehr.
    Hat jemand da ne Ahnung, woran das liegen könnte, bzw. was bedeuten die anderen angaben bei CeateProcess?



  • Also, ich schreib nochma, wann das Problem genau auftritt:
    In dem Moment, wo ich das auf eine CD brenne und versuche mit dem Programm zu kopieren, bekomme ich den Fehler. Wenn ich es mit der Kopier-Funktion von Windows-Explorer kopiere und dann die Bat-Dateien über das Programm aufrufe, bekomme ich keinen Fehler. Wenn ich das Programm von der Festplatte starte, bekomme ich ebenfalls keinen Fehler.

    hat irgendjemand ne Ahnung, wodurch das kommt????

    😕 😞 😕 😞 😕



  • Wenn ich die Dateien Brenne, mit dem Explorer kopiere und dann die Bat-Dateien "von Hand" aufrufe, funktioniert es.
    Muss CreateProcess() irgendwelche Temporären Dateien Schreiben, die es auf einer CD nicht schreiben kann?
    Oder muss ich irgendeinen Parameter von CreateProcess ändern, damit die Bat-Datei sozusagen so aufgerufen wird, wie mit einem Doppelklick????????

    ???????????????????????



  • Hab mal ShellExecute ausprobiert, es tritt genau der gleiche Fehler an genau den gleichen Stellen auf.
    Komisch, nicht?



  • wahrscheinlich ne dumme Frage, aber ich benutze VC++ 2005 und ich will ne Windowsapplikation mit CreateProcess launchen oder allgemein was was mit WinAPI zu tun hat machen (windows.h ist eingebunden) und ich hab ne Win32 Konsolenanwendunge, haut er mir Compilerfehler



  • Bocky< schrieb:
    Muss CreateProcess() irgendwelche Temporären Dateien Schreiben, die es auf einer CD nicht schreiben kann?

    Nein.

    Bocky< schrieb:
    Komisch, nicht?

    Was ist, wenn du die Dateien auf der Festplatte läßt und als schreibgeschützt kennzeichnest?

    @cpp newbie:
    1. Neue Frage, neuer Thread
    2. hier nachschauen
    (wär das nicht mal was für die FAQ?)



  • Das liegt tatsächlich an den Schreibrechten. Ich hab in meinem Programm ne Kopierfunktion, die die Dateien einfach nur kopiert, also die Dateioptionen von der CD übernimmt (schreibgeschützt). Nun hab ich nach dem kopieren einer Datei einfach den Schreibschutz der gerade kopierten Datei gelöscht. So funktioniert das jetzt. 🙂


Log in to reply