Unsichtbare Shellaufrufe??



  • Hallo,
    ich würde gerne in meinem Programm (MFC, sollte aber egal sein oder? Hoffe ich bin hier im richtigen Bereich) eine andere .exe aufrufen. Bis jetzt mache ich das mit

    system("start.exe");
    

    das geht auch, nur erscheint dann immer eine neue DosBox, das sieht nicht so dolle aus. Das geht doch auch sicher so, daß kein Fenster angezeigt wird oder?
    Wäre super wenn mir da jemand ein Codeschnippsel posten könnte.

    Danke



  • CreateProcess mit STARTUPINFO dwFlags = STARTF_USESHOWWINDOW und wShowWindow = SW_HIDE



  • okay, danke das funktioniert. Aber geht das nicht einfacher. Ich es muß nicht unbedingt ein extra Prozess generiert werden. Lieber wäre es mir sogar wenn das nicht passieren würde.
    Geht das vielleicht mit einem _spawn Aufruf?



  • Wie "extra Prozess" !????
    Willst Du nun einen externen Prozess starten oder nicht????

    Was glaubst Du was "system" bzw. "spawn" machen?



  • hmm.. stimmt, da hast du auch wieder recht. 🙄
    Ist nur so, daß ich für Create Process elends viel Code brauche. Spawn wäre nur 1 Zeile (falls es damit geht). Das wichtige für mich ist, daß ich aus MFC und einer Konsolenanwendung eine .exe ausführen kann ohne, daß ein Dosfenster aufgeht.
    Naja sonst nehm ich halt das Create Process sieht zwar etwas wild aus, aber es geht *G*. Wenn die exe fertig ist muß ich aber nichts machen wie "deleteProcess" oder?



  • Wartest Du etwa, biss die EXE fertig ist? Das CreateProcess kommt ja sofort zurück, auch wenn die EXE sich noch nicht beendet hat!
    In der zurückgegebenen PROCESS_INFORMATION musst Du aber die beiden Handles mittels CloseHandle schliessen... sonst hast Du ein kleines Handle-Leak...

    Siehe auch:
    http://msdn.microsoft.com/library/en-us/dllproc/base/creating_processes.asp



  • Genau. Ich warte bis die exe fertig ist. Habe das bis jetzt mit System(...) gemacht, wo dann das Fenster aufgeht und das Programm eben wartet bis die exe fertig ist.
    Das meinte ich mit "extra Prozess generieren". Du hast wohl Recht, daß es immer ein neuer Prozess sein muß, aber für mich muß er zumindest nicht nebenläufig sein, bzw. es wäre besser wenn er es nicht ist.

    Ich schreibe eben meine Diplomarbeit. Und mein Programm verwendet eine schon vorhandene EXE um sich Daten in einem bestimmten Format zu holen. Also kann mein Programm erst weitermachen wenn die EXE sein Ergebnis geliefert hat. Aber, daß es wohl dochnicht so einfach ist, diese EXE eben unsichtbar zu starten und mein Programm auf das Erbenis warten zu lassen hätt ich nicht gedacht.



  • Mit system, span, CreateProcess, usw. wird immer ein neuer Prozess gestartet... ob Du nun wartest bis der Fertig ist oder nicht ist ja von Dir abhängig...

    Wenn Dich 10 Zeilen-Code stören um ein Fenster zu verhindern, dann hast Du mit C++ die falsche Programmiersprache gewählt 🙄



  • *smile* okay...
    Dann werde ich mich mal etwas in CreateProcess einarbeiten damit mein Programm noch auf das Ende des externen Prozesses wartet....
    bzw. ich schau mir noch "ShellExecute" an. Habe ich gerade in einem anderne Thread gefunden. Aber ich denke ich werde mit CreateProcess eine Funktion für meine Zwecke basteln müssen.

    Danke für deine Hilfe



  • Um auf das Ende des externen Processes zu warten kannst du WaitForSingleObject() auf WAIT_OBJECT_0 abfragen



  • Oder einfach nur das Beispiel lesen, welches ich gepostet habe:
    http://msdn.microsoft.com/library/en-us/dllproc/base/creating_processes.asp



  • Prima. danke euch für eure Hilfe und Beispiele. Klappt nun alles.


Anmelden zum Antworten