[Delphi]Problème avec CreateProcess / winexec

Discussion dans 'Web, design' créé par AcidBird, 20 Janvier 2004.

Statut de la discussion:
Fermée.
  1. Offline
    AcidBird Touriste
    Lorsque j'essaye de lancer un exécutable à l'aide de la commande CreateProcess, winExec ou ShellExecute, le process est bien créé (il apparait dans la liste des process du task manager) mais le programme ne s'affiche jamais (rien n'apparait à l'écran). Quelqu'un a-t-il une idée d'ou cela pourrait provenir ?

    Voila les différents code que j'utilise pour lancer des exe à partir d'un autre programme et qui a toujours fonctionné jusqu'à présent ...


    ShellExexute :
    ....
    shellExecute(self.Handle, PChar('open'),pChar(FileToExec),nil,nil ,SW_MAXIMIZE);
    ...

    WinExec :
    ...
    WinExec(pChar(FileToExec), SW_MAXIMIZE);
    ...

    CreateProcess :

    function ExecuteProgram( const ProgramName: String;
    WaitUntilGone: Boolean;
    var ID: Integer; {instance handle or process ID}
    var Active: Boolean ): Boolean;
    var
    TSI: TStartupInfo;
    TPI: TProcessInformation;
    ECP: DWord;
    begin
    Result := False;
    Active := True;
    try
    FillChar(TSI, SizeOf(TSI), 0);
    TSI.CB := SizeOf(TSI);
    if CreateProcess(PChar(ProgramName), nil, nil, nil, False,
    DETACHED_PROCESS OR NORMAL_PRIORITY_CLASS, nil, nil, TSI, TPI) then
    begin
    ID := TPI.dwProcessID;
    CloseHandle(TPI.hThread);
    WaitForInputIdle(TPI.hProcess, 10000); {let process start!}
    if WaitUntilGone then begin
    repeat
    Application.ProcessMessages;
    GetExitCodeProcess(TPI.hProcess, ECP);
    until (ECP <> STILL_ACTIVE) or Application.Terminated;
    CloseHandle(TPI.hProcess);
    end;
    Result := True;
    end;
    finally
    Active := False;
    end;
    end;
    AcidBird, 20 Janvier 2004
    #1
  2. Offline
    AcidBird Touriste
    Bon ben pour ceux que ca intéresse ...

    Pas moyen de fair tourner l'exe avec Winexec et CreateProcess, par contre, en utlisant un ShellExecute avec la commande Open sur un shortcut vers l'application, cela fonctionne :!: . Maintenant savoir pourquoi CreateProcess ne fonctionne pas là c'est autrechose :roll:
    AcidBird, 21 Janvier 2004
    #2
  3. Offline
    dagibbon Elite
    je ne connais pas la commande createprocess ... sinon avec shellexecute, tu mes sw_°shownormal, et ca devrait aller...

    ShellExecute(handle, 'open' , pchar([Programme a executer]), pchar(''), 0, SW_SHOWNORMAL);

    ca doit marcher non?

    tu ne dois pas mettre self.handle, sinon tu le partages...et donc un des deux process n'en a pas.

    Ps: evites les 'nil' pour les shellexec ... ca sent le buffer overflow a plein nez ca...
    dagibbon, 21 Janvier 2004
    #3
  4. Offline
    titloup Elite
    Je pense que c'est pour lancer un processus en tâche de fond les autres :p

    J'ai aussi utilisé ShellExecute quelques fois :wink:
    titloup, 21 Janvier 2004
    #4
  5. Offline
    lEcEd Touriste
    Pour le CreateProcess:

    dans ta structure LPSTARTUPINFOW (TSI) tu as un champs qui définit si tu veux voir la windows de ton process ou pas, tout dépend comment tu as définit ta structure TSI, mais normalement ce champs devrait s'appeler wShowWindow (ou un truc du genre). Suivant la valeur que tu mets dans ce champs le createprocess va te montrer ou te cacher ta fenêtre d'exécution.

    j'espère que ca t'aide.
    lEcEd, 21 Janvier 2004
    #5
  6. Offline
    AcidBird Touriste
    Quelques remarques :

    Tout d'abord j'utilise la routine que je donne pour lancer un exe via createProcess depuis plus de 2 ans et c'est la première fois que je tombe sur ce genre de problème. J'ai bien évidement essayé de changer la valeur de wShowCmd mais cela ne change rien (et ce n'est pas étonnant, dans 95% des programmes, c'est un process global qui crée ta fenêtre et génére l'équivalent d'un Form.Show donc même en passant sw_hide comme je le fait, la fenêtre s'ouvrira quand même).

    J'utilise CreateProcess car il est bcp plus facile de "suivre" la vie du process via l'Id qu'on recoit dans le TProcessInfo (essaye de lancer un prgramme d'install fait par inbstallShield par exemple et d'attendre la fin de son exécution via un shellExecute / winexec ... c'est la galère car ce n'est pas le process créé qu'il faut attendre mais bien un process enfant --> bon courage pour retrouver ce process là :) ).

    Ensuite pour le shellExecute, pareil j'ai essayé toutes les valeurs possibles mais rien n'y fait. Par contre pour ce qui est de l'handle à passer, c'est celui d'une fenêtre parent --> même en passant celui de mon application, la fenêtre enfant devrait être créée non ? Et tu passes quel valeurs pour l'handle alors ?
    Pour les nil ... ca vient de l'aide : si lpFile est remplit, lpParamtyer devrait être à nul --> je pourrais passer une chaine vide mais ca ne doit rien changer.
    (c'est la première fois que j'utilise shellExecute :) )

    Enfin je vais essayer de contacter la personne qui a écrit cet exe récalcitrant afin de savoir pourquoi mon code ne marche pas ... je vous tiendrai au courant si j'ai des nouvelles :)
    AcidBird, 21 Janvier 2004
    #6
Statut de la discussion:
Fermée.