IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

Récupérer l'état d'un processus créé avec CreatProcess


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre éclairé
    Avatar de Didier L
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2004
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 503
    Points : 806
    Points
    806
    Par défaut Récupérer l'état d'un processus créé avec CreatProcess
    Bonjour à tous,

    Après une bonne lecture des tutos, de la faq, des différents posts traitant le sujet de "CreatProcess" et une recherche sur Google, je commence à désespérer de trouver une solution

    Voila mon problème, je développe un petit assistant d'installation, qui lance des procédures d'install de différent produit. Grace à CreatProcess, je peux enchainer mes installs. Mais puis-je récuperer un résultat de mon process afin de savoir s'il terminé correctement, si l'utilisateur à annuler l'installation, ou si une erreur s'est produite éventuellement.

    Merci d'avance aux bonnes âmes du forum

    Pour Info le dev sera en licence GPL une fois terminé

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Avec WMI c'est possible en utilisant des appels asynchrones.
    Avec les API, n'ayant jamais fait, je regarderais de ce coté Asynchronous Procedure Calls
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/asynchronous_procedure_calls.asp

    un exemple en C
    http://www.codeproject.com/threads/queueuserapcex.asp

    Un article sur le sujet (Delphi)
    http://www.thedelphimagazine.com/Samples/1636/1636.htm

    il y a peut être ceci aussi
    http://www.clevercomponents.com/articles/article019/delphi6sync.asp

    Bonne lecture

  3. #3
    Membre éclairé
    Avatar de Didier L
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2004
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 503
    Points : 806
    Points
    806
    Par défaut

    Mon anglais n'est plus ce qu'il était!
    (ou peut être n'a t'il jamais vraiment été)

    J'ai vraiment du mal à comprendre la gestion des appels asynchrones

    Je trouve qu'il manque d'exemple concret et simple.
    Je pensais pouvoir trouver dans une propriété ou un retour de fonction des valeurs que je puisse tester.

    De plus les assistants d'instalation ou programme que je lance ne sont pas développés par moi et sont donc "fermés".
    N'existe-t-il pas de status du style "success","abort",ou "error" pour un thread?

    Je m'avoue plusque perdu!

  4. #4
    Membre éclairé
    Avatar de Didier L
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2004
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 503
    Points : 806
    Points
    806
    Par défaut
    Bonsoir,

    J'ai trouvé dans la faq une fonction qui semblait répondre à mon besoin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        GetExitCodeProcess(ProcessInfo.hProcess,Result);
    Dans la doc il est dit que cette fonction retourne un code selon la fermeture du process et 0 si la fonction ne marche pas (si j'ai bien compris )

    Seulement dans mon code elle me retourne toujours zéro que j'aille au bout de mon installation ou que je l'annule avant! Pourquoi?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    procedure TForm2.BtnInstallerClick(Sender: TObject);
    Var
      StartInfo   : TStartupInfo;
      ProcessInfo : TProcessInformation;
      Fin         : Boolean;
      Result : Cardinal;
    begin
      { Mise à zéro de la structure StartInfo }
      FillChar(StartInfo,SizeOf(StartInfo),#0);
      { Seule la taille est renseignée, toutes les autres options }
      { laissées à zéro prendront les valeurs par défaut }
      StartInfo.cb     := SizeOf(StartInfo);
      { Lancement de la ligne de commande }
      If CreateProcess(Nil,Pchar(vsCommande), Nil, Nil, False,
                    0, Nil, Nil, StartInfo,ProcessInfo) Then
      Begin
        { L'application est bien lancée, on va en attendre la fin }
        { ProcessInfo.hProcess contient le handle du process principal de l'application }
        form2.Animate1.Active := True;
        InstallerVF[viIndiceEtape] := True;
        BtnInstaller.Enabled := False;
        Fin:=False;
        Repeat
          { On attend la fin de l'application }
          Case WaitForSingleObject(ProcessInfo.hProcess, 100) Of
            WAIT_OBJECT_0 :Fin:=True; { L'application est terminée, on sort }
            WAIT_TIMEOUT  :;          { elle n'est pas terminée, on continue d'attendre }
          End;
          { Mise à jour de la fenêtre pour que l'application ne paraisse pas bloquée. }
          Application.ProcessMessages;
        Until Fin;
        { C'est fini On passe à l'étape suivante si on n'est pas sur la dernière étape}
        form2.Animate1.Active := False;
        GetExitCodeProcess(ProcessInfo.hProcess,Result);
    Showmessage(inttostr(Result));
        if viIndiceEtape < viNombreEtapes then EtapeSuivante(Sender);
      End
      Else RaiseLastOSError;
    end;
    Merci d'avance

  5. #5
    Membre confirmé
    Avatar de lil_jam63
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    447
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 447
    Points : 600
    Points
    600
    Par défaut
    Bonjour, en fait le paramètre lpExitCode peux recevoir plusieurs valeurs:
    - la valeur de uExitCode dans TerminateProcess() et ExitProcess()
    - la valeur retourné par la fonction WinMain() ou Main() du process
    - la valeur de l'exception qui a causé la fin du process.

    Pour les fonction Main() et WinMain() si le process se termine correctement avec le message WM_QUIT, le paramètre lpExitCode recevra la valeur WPARAM de ce même message et donc le nExitCode envoyé par PostQuitMessage() mais celà seulement si la fonction termine avant de rentrer dans la boucle de message, elle retourne 0 (ce qui explique peut être ton resultat).

    Pour l'erreur, tu peux vérifier que la valeur retournée n'est pas une exception par contre, je ne vois pas trop comment tu peux savoir si l'installation s'est terminé d'elle même ou si c'est l'utilisateur qui l'a demandé. Mais faudrais approfondir un peu plus les recherches, ce que je viens de te dire c'est un condensé de ce que j'ai trouver dans le MSDN.

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/09/2005, 21h39
  2. comment récupérer l'état d'un capteur?
    Par r0d dans le forum Périphériques
    Réponses: 8
    Dernier message: 17/08/2005, 20h13
  3. Réponses: 5
    Dernier message: 22/12/2004, 16h50
  4. Créer un état à source de données multiples avec Delphi5
    Par khenri2 dans le forum Bases de données
    Réponses: 7
    Dernier message: 23/10/2004, 22h15
  5. Récupérer le code HTML d'une page avec Delphi 7
    Par PsyKroPack dans le forum Web & réseau
    Réponses: 5
    Dernier message: 06/02/2003, 21h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo