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

Langage Delphi Discussion :

ShellExecuteAndWait et Vista


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 87
    Points : 60
    Points
    60
    Par défaut ShellExecuteAndWait et Vista
    Bonjour à tous,

    J'utilise un méthode pour lancer un ShellExecute et attendre la fin de l'opération pour continuer.
    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
     
    var
      vSEInfo   : TShellExecuteInfo;
    begin
      //Initialisation de la structure ShellExecuteInfo
      ZeroMemory(@vSEInfo, SizeOf(vSEInfo));
     
      //Remplissage de la structure ShellExecuteInfo
      vSEInfo.cbSize       := SizeOf(vSEInfo);
      vSEInfo.fMask        := SEE_MASK_NOCLOSEPROCESS  or SEE_MASK_FLAG_NO_UI;
      vSEInfo.Wnd          := vHandle;
      vSEInfo.lpVerb       := PWideChar(vOperation);
      vSEInfo.lpFile       := PWideChar(vFichier);
      vSEInfo.lpParameters := PWideChar(vParametres);
      vSEInfo.lpDirectory  := PWideChar(vRepertoire);
      vSEInfo.nShow        := vAffichage;
      ExitCode := 1;
      //Execution
      if ShellExecuteEx(@vSEInfo) then
      begin
        //ShellExecuteEx OK : attendre la fin du process
        Result := WaitForSingleObject(vSEInfo.hProcess, vDuree);
        GetExitCodeProcess(vSEInfo.hProcess, ExitCode);
      end
      else
      begin
        //ShellExecuteEx KO : renvoyer l'erreur
        Result := GetLastError();
      end;
      CloseHandle(vSEInfo.hProcess);
    end;
    Sous XP, pas de problèmes, mais sous vista, je reste bloqué sur mon appel à ShellExecuteEx (L'appli bloque ... indéfiniment comme si c'était une boucle). Ceci vient du SEE_MASK_NOCLOSEPROCESS car un autre mask ne me bloque pas. J'ai trouvé sur internet plusieurs problèmes avec vista et shellexecuteex mais jamais celui là !

    Quelqu'un aurait une idée pour me sortir de ce mauvais pas car c'est extrêmement gênant !

  2. #2
    Membre du Club
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 87
    Points : 60
    Points
    60
    Par défaut
    J'avance dans la résolution de mon problème. Le code si dessus compilé sous XP et exécuté sous Vista marche. Le même code compilé sous Vista et exécuté sous Vista ne marche pas. Et ceci avec la même version de Delphi (2009) ...

  3. #3
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    salut,

    Essaye ça sur Vista:
    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
    41
    42
    43
    44
    45
    46
    47
    function ExecAndWait(Filename, Params: String;
                         WindowState: Word = SW_SHOWNORMAL): boolean;
    var
      {$IFDEF UNICODE} ShExecInfoW: SHELLEXECUTEINFOW; {$ENDIF}
      ShExecInfoA: SHELLEXECUTEINFOA;
    // MSDN: ShellExecuteEx, ShellExecuteInfo
    begin
      Result := false;
      if (Filename = '') or not FileExists(FileName) then
        exit;
      {$IFDEF UNICODE}
      if Win32IsUnicode then
      begin
        ShExecInfoW.Wnd          := GetForegroundWindow;
        ShExecInfoW.cbSize       := SizeOf(SHELLEXECUTEINFOW);
        ShExecInfoW.fMask        := SEE_MASK_NOCLOSEPROCESS;
        ShExecInfoW.lpVerb       := 'open';
        ShExecInfoW.lpFile       := PWideChar(WideString(Filename));
        ShExecInfoW.lpParameters := PWideChar(WideString(Params));
        ShExecInfoW.lpDirectory  := PWideChar(WideString(ExtractFileDir(Filename)));
        ShExecInfoW.nShow        := WindowState;
        Result := ShellExecuteExW(@ShExecInfoW);
        try
          if Result then WaitForSingleObject(ShExecInfoW.hProcess, INFINITE);
        finally
          CloseHandle(ShExecInfoW.hProcess);
        end;
      end
      else
      {$ENDIF}
      begin
        ShExecInfoA.Wnd          := GetForegroundWindow;
        ShExecInfoA.cbSize       := sizeof(SHELLEXECUTEINFOA);
        ShExecInfoA.fMask        := SEE_MASK_NOCLOSEPROCESS;
        ShExecInfoA.lpVerb       := 'open';
        ShExecInfoA.lpFile       := PAnsiChar(AnsiString(Filename));
        ShExecInfoA.lpParameters := PAnsiChar(AnsiString(Params));
        ShExecInfoA.lpDirectory  := PAnsiChar(AnsiString(ExtractFileDir(Filename)));
        ShExecInfoA.nShow        := WindowState;
        Result := ShellExecuteExA(@ShExecInfoA);
        try
          if Result then WaitForSingleObject(ShExecInfoA.hProcess, INFINITE);
        finally
          CloseHandle(ShExecInfoA.hProcess);
        end;
      end;
    end;
    Testé sur XP!

    A+

    NABIL74

  4. #4
    Membre du Club
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 87
    Points : 60
    Points
    60
    Par défaut
    Désolé mais je ne trouve pas la méthode Win32IsUnicode ... il faut mettre quoi dans les uses ??

  5. #5
    Membre du Club
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 87
    Points : 60
    Points
    60
    Par défaut
    NABIL74 je n'ai pas réussit à mettre ton code car je ne trouve pas Win32IsUnicode, ni son équivalent ... Mais suite à une mise à jour de Vista ... tout marche ! Donc ce qui n'allait pas je n'en sais rien ... mais une bibliothèque windows je suppose.
    En tout cas, merci.

  6. #6
    Membre du Club
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    87
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 87
    Points : 60
    Points
    60
    Par défaut
    Décidément ... Je croyais que le problème était partis ... et le revoilà ! Sans que je comprenne ce que j'ai changé entre temps (En tout cas, c'est pas dans le code que j'ai changé quelque chose ...)
    Si quelqu'un a une idée, elle est la bienvenue ...

Discussions similaires

  1. Installation Windows Vista alias Longhorn
    Par virgul dans le forum Windows Vista
    Réponses: 16
    Dernier message: 28/10/2005, 13h45
  2. La communauté OpenGL s'inquiète de Windows Vista
    Par micatmidog dans le forum OpenGL
    Réponses: 16
    Dernier message: 22/08/2005, 09h15
  3. pour les beta testeurs de windows vista
    Par largowinch dans le forum Windows Vista
    Réponses: 9
    Dernier message: 19/08/2005, 21h02
  4. Sauvons OpenGL sous Windows Vista
    Par Groove dans le forum OpenGL
    Réponses: 2
    Dernier message: 19/08/2005, 13h29
  5. Visual C++ et Windows Vista
    Par cjacquel dans le forum MFC
    Réponses: 2
    Dernier message: 08/08/2005, 13h45

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