Frage zu CreateProzess und ShellExecute



  • Hallo Zusammen,
    ich möchte aus meinem Programm heraus ein kleines Programm starten mit dem ich ein PDF über die Commandline drucken kann.
    Probiert habe ich es damit:

    STARTUPINFO          si = { sizeof(si) };
    PROCESS_INFORMATION  pi;
    
    CreateProcessA("pdfprint.exe", "-printer \"Drucker\" -copies \"1\" rechnung.pdf", 0, 0, FALSE, 0, 0, 0, LPSTARTUPINFOA(&si), &pi);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    

    Wenn ich das so mache wird das Programm in der Commandline auch gestartet. Allerdings funktioniert es nicht richtig. Leider kann ich auch nicht feststellen was falsch ist, da sich das Commandline Fenster gleich wieder schließt.
    Kann ich CreateProcess so starten, dass es das Fenster offen lässt?

    Ich habe das ganze auch schon über ShellExecute probiert. Da funktioniert alles bestens. Da wäre meine Frage, ob ich in den Status des Fenster abfragen kann? Das mein Programm erst weiter läuft, wenn das Fenster geschlossen ist.

    Danke im voraus.



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) 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.



  • Also, wenn du CreateProcessA aufrufst, dann musst du natürlich auch STARTUPINFOA als Parameter einsetzen und nicht den STARTUPINFOW (Unicode) einfach umcasten.
    Je nachdem wie dein Prozess abläuft (Konsole, keine Konsole, umgeleitetes IO) kannst du über das Flag CREATE_NEW_CONSOLE den Kindprozess von deiner Umgebung trennen.
    Und wenn du die Ein/Ausgabe des Kindprozesses abfangen möchtest, dann musst du Pipes (oder andere Handles) in der STARTUPINFO setzen (gemeinsam mit dem Flag STARTF_USESTDHANDLES)
    MS hat ja ein schönes Beispiel dafür:
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499%28v=vs.85%29.aspx

    Sei außerdem immer vorsichtig mit der CommandLine. Ich bin immer am besten gefahren, wenn ich den vollständigen Pfad zur EXE samt Argumenten im 2. Parameter übergeben habe und der erste auf NULL belassen wurde. Auch das CurrentDirectory (8. Parameter) sollte korrekt gesetzt sein, wenn dein Kindprozess gewisse Anforderungen hat.



  • Auch musst Du den *ersten* Parameter von CreateProcess immer *NULL" lassen und den EXE-Namen erst im zweiten Parameter angeben! Siehe auch Doku!!!

    Also:

    CreateProcess(_T("pdfprint.exe -printer \"Drucker\" -copies \"1\" rechnung.pdf"), ...)
    

  • Mod

    Ich würde Dir eigentlich immer zur Verwendung von ShellExecuteEx raten.

    Seitdem es UAC gibt hast Du hier etwas mehr Kontrolle.



  • Danke Martin Richter. Ich habe es jetzt auch mit ShellExecuteEx gelöst. Damit klappt es wunderbar.


Log in to reply