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 :

XE3: CreatePRocess et exe non trouvé


Sujet :

Langage Delphi

  1. #1
    Membre expert

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut XE3: CreatePRocess et exe non trouvé
    Bonjour,

    Sur une tablette avec Windows 8, je peux exécuter notepad.exe par le classique "Démarrer/Exécuter" en tapant simplement le nom de l'exe.
    Avec XE3, j'utilise CreateProcess pour faire la même chose et j'obtiens une erreur 2 Windows (fichier non trouvé).

    Comment faire (si c'est possible) avec CreateProcess, pour lancer un exécutable en donnant simplement son nom sans être obligé d'indiquer le chemin complet ?

    Je précise que notepad n'est qu'un exemple. L'exe que je veux lancer est normalement accessible par son simple nom mais apparemment pas toujours au même endroit selon les installations.

    Papy

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 645
    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 645
    Points : 25 383
    Points
    25 383
    Par défaut
    le plus proche c'est ShellExecuteEx, la structure SHELLEXECUTEINFOW à la fois en entrée qu'en sortie comme la valeur de retour hProcess (via SEE_MASK_NOCLOSEPROCESS)

    Je contrôle ainsi des applications liées à une extension, j'attends le démarrage avec WaitForInputIdle
    Puis avec GetProcessId, je peux lister les fenêtres avec EnumWindows pour ensuite les positionner où j'ai besoin par rapport à mon programme

    Puis je peux utiliser GetExitCodeProcess, TerminateProcess et CloseHandle


    C'est ShellExecuteEx qui gère les liens d'extension ou alors reconnait des noms comme IExplore sans devoir founir le chemin complet
    CreateProcess lui est plus rigide à ce sujet (il doit peut-être quand même utilisé le PATH mais doit exiger l'extension)

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 807
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 807
    Points : 13 500
    Points
    13 500
    Par défaut
    ShellExecute se base sur la clé HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\MonProg.exe.

    Pour obtenir le même comportement avec CreateProcess, il faut lire manuellement cette clé.
    Mais il est préférable d'utiliser ShellExecute(Ex). Le seul cas qui requiert encore spécifiquement CreateProcess et le démarrage d'une application sur un bureau différent.

  4. #4
    Membre expert

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    ça fonctionne avec ShellExecuteEx.
    Par contre, je conserve le hProcess pour le passer ensuite à TerminateProcess mais ça ne ferme pas l'application. Est-ce qu'il faut utiliser un flag spécial lors du lancement ?

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 807
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 807
    Points : 13 500
    Points
    13 500
    Par défaut
    Il faut préciser SEE_MASK_NOCLOSEPROCESS. Ne pas oublier que tu dois libérer toi-même hProcess quand tu n'en as plus besoin.

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 645
    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 645
    Points : 25 383
    Points
    25 383
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Il faut préciser SEE_MASK_NOCLOSEPROCESS
    Je confirme, d'ailleurs, je l'avais mentionné !

    Extrait de mon code qui permet de relire des fichiers vidéo par l'application lié à leur extension

    Code c++ : 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
     
      SHELLEXECUTEINFOW ExecInfo;
      ZeroMemory(&ExecInfo, sizeof(ExecInfo));
      ExecInfo.cbSize = sizeof(ExecInfo);
      ExecInfo.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_CONNECTNETDRV | SEE_MASK_NOCLOSEPROCESS;
      ExecInfo.hwnd = AControl->Handle;
      ExecInfo.nShow = SW_SHOW;
     
      ExecInfo.lpFile = FPlaybackFileInfo.FileName.c_str();
      ExecInfo.lpDirectory = ExtractFileDir(FPlaybackFileInfo.FileName).c_str();
      ExecInfo.lpParameters = NULL;
     
     
      BOOL ShellRet = ShellExecuteExW(&ExecInfo);
     
      if (ShellRet && ExecInfo.hProcess)
      {
        ...
     
      else
      {
        if (AControl)
          FLastSysErrorMessage = SysErrorMessage(GetLastError());
      }

    et le code de fermeture

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            DWORD ExitCode;
            if (GetExitCodeProcess(ExecInfo.hProcces, &ExitCode))
              TerminateProcess(ExecInfo.hProcces, ExitCode);
     
            CloseHandle(ExecInfo.hProcces);

  7. #7
    Membre expert

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    Merci, c'est tout bon


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

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/06/2015, 11h26
  2. La compilation échoue : cc1plus.exe non trouvé
    Par Crepuscule3 dans le forum Qt Creator
    Réponses: 3
    Dernier message: 07/03/2013, 14h35
  3. [CLI] svn.exe non trouvé
    Par menzlitsh dans le forum Subversion
    Réponses: 2
    Dernier message: 02/04/2009, 12h56
  4. Message d'erreur "explorasi.exe" non trouvé
    Par hocine dans le forum Windows XP
    Réponses: 1
    Dernier message: 25/10/2007, 18h57

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