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 :

ShellExecute avec attente de fin


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut ShellExecute avec attente de fin
    Bonjour

    Dans le logiciel d'un client, une impression est lancée basiquement avec un ShellExecute avec le verbe "print".
    Il me demande une solution pour que l'impression soit bloquante dans Delphi avant de passer à la ligne de code suivante.
    Je pense utiliser ShellExecuteEX avec le mask approprié suivi d'un WaitForSingleObject sur le handle du processus lancé.
    Mais avant de me lancer, j'aimerais avoir votre avis.
    D'abord, est-ce que c'est jouable, et en plus, est-ce que je vais chercher bien trop loin par oubli de chose plus simple ?

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Il y a deux étapes dans une impression :
    - la construction du document et l'ajout dans le spooler : bloquant pour un programme généralement
    - l'impression à partir du Spool : Asynchrone, l'application à ce moment ne sait plus ce qui se passe (*)

    Je te recommande d'utiliser un Thread, oui ça peut paraître paradoxal pour un truc bloquant mais avec WaitForSingleObject INFINITE, cela évitera que ton application soit en "Pas de Réponse"
    tu gères dans le Main Thread un gestionnaire du OnTerminate du Thread secondaire pour masquer le popup de patience
    Je ne te conseille pas de le faire en mode j'attends pour poursuivre, car si tu n'as jamais la fin, ton programme va bloquer pour une cause externe, tu pourras faire une boucle de WaitForSingleObject mais je ne sais pas trop si Handle de ShellExecuteEx le tolère bien.
    Le popup de patience, j'inclurais un bouton "continuez sans attendre" au cas où.

    Selon le logiciel, une approche OLE pourrait permettre un pilotage plus fin du "Print" comme sous Office ou Acrobat Reader.


    (*) Surveiller le spool est possible mais disons que c'est plus extrême avec GetPrinter + GetPrinter (PPrinterInfo2) + GetJob (PJobInfo1) pour retrouver le job si l'on connaît son nom (facile en direct c'est Printer.Title bien plus dur à déterminer si l'impression est par un logiciel tiers)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    J'ai aussi pensé à scruter l'état de l'imprimante mais trop comliqué pour ce que ça va servir.

    C'est vrai que le thread sera mieux pour ne rien bloquer.
    Sinon, je viens d'essayer vite et ça fonctionne.

    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
     
    var
      H   : THandle;
      Info: TShellExecuteInfoW;
      F: string;
    begin
      if PromptForFileName(F) = False then
        Exit;
     
      FillChar(Info, SizeOf(Info), 0);
      Info.cbSize := SizeOf(Info);
      Info.fMask  := SEE_MASK_NOCLOSEPROCESS;
      Info.Wnd    := Application.Handle;
      Info.lpVerb := PChar('print');
      Info.lpFile := PChar(F);
      Info.nShow  := SW_SHOWNORMAL;
      if ShellExecuteEx(@Info) then
      begin
        if Info.hInstApp > 32 then
        begin
          WaitForSingleObject(Info.hProcess, INFINITE);
        end
        else
        begin
          Memo1.Lines.Add(Info.hProcess.ToString + ' (erreur)');
          ShowMessage('Erreur');
        end;
      end;
      ShowMessage('ok');
    Il n'y a plus qu'à ajouter le thread et ça sera bon.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Attente de fin d'éxécution avant "mv"
    Par lodilodi dans le forum Linux
    Réponses: 1
    Dernier message: 02/04/2007, 15h49
  2. Réponses: 1
    Dernier message: 16/03/2007, 14h26
  3. [D7]Prob ShellExecute avec arguments
    Par goldkey dans le forum Delphi
    Réponses: 2
    Dernier message: 24/10/2006, 14h23
  4. Comment utiliser ShellExecute avec un programme DOS ?
    Par RC10GT_MGT dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 22/09/2005, 14h23
  5. [JComboBox] editable avec % affiché en fin de saisie
    Par tomburn dans le forum Composants
    Réponses: 6
    Dernier message: 27/04/2005, 16h41

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