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

Windows Discussion :

[C++]Executer une application


Sujet :

Windows

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut [C++]Executer une application
    Salut !
    J'ai du mal à réutiliser une fonction trouvée dans le gestionnaire des tâches de desk bsd. J'ai fais un mini prog en console pour lancer une application, mais ca ne marche pas. J'utilise un scanf pour écrire dans handle. J'ai peur que ce soit ca qui bloque...
    Voici le code complet :

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include <windows.h>
    #include <Tlhelp32.h>
    #include <stdio.h>
    #include <string.h>
    #include <commctrl.h>
    
    BOOL Exe(HWND hwExe);
    
    int main(int argc, char *argv[])
    {
        static HWND hwExe;
       
        scanf("%s", &hwExe);
        Exe(hwExe);
        system("PAUSE");
    }
    
    /* Executer un processus. */
    BOOL Exe(HWND hwExe)
    {
         char * szBuffer;
         unsigned int uiSize;
         unsigned int uiCount;
         
         if((uiSize = SendMessage(hwExe,WM_GETTEXTLENGTH,0,0)) == 0) return FALSE;
         szBuffer = (char*)malloc(sizeof(char)*(uiSize+1));
         if(szBuffer == NULL){
                     return FALSE;
         }
         
         GetWindowText(hwExe,szBuffer,(uiSize+1));
         szBuffer[uiSize] = '\0';
         
         for(uiCount = 0 ; uiCount<uiSize ; uiCount++){
             if(szBuffer[uiCount] == ' '){ /* Si il y à un espace, c'est qu'il y a un argument. */
                 char * szAppName;
                 char * szArgument;
                 
                 szAppName = (char*)malloc(sizeof(char)*(uiCount+1));
                 szArgument = (char*)malloc(sizeof(char)*(uiSize-uiCount)+1);
                 
                 sscanf(szBuffer,"%s %s",szAppName,szArgument);
                 
                 szAppName[uiCount] = '\0';
                 szArgument[(uiSize-uiCount)] = '\0';
                 
                 ShellExecute(NULL,"open",szAppName,szArgument,NULL,SW_SHOWNORMAL);
                 
                 free(szAppName);
                 free(szArgument);
                 break;
             }else if(uiCount == (uiSize-1)){ /* Sinon. */
                   ShellExecute(NULL,"open",szBuffer,0,NULL,SW_SHOWNORMAL);
             }
                 
         }
         
         free(szBuffer);
    }
    Voila.
    Merci pour votre aide !
    PS: je cherche un tuto sur les Handles, Processus et compagnie. Quelqu'un peut-il m'informer ? Merci.

  2. #2
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    HWND est un handle de fenêtre, je ne vois pas le rapport avec un processus.

    Que veux-tu faire exactement ?
    L'itération est humaine; la récursion, divine.

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Et GetWindowText() rend le titre de la fenêtre, qui n'a rien à voir avec l'exe (même pour une console : c'est paramétrable).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    Normalement on doit pouvoir executer une application avec son nom, ou plutot son handle. Enfin je crois que ca doit marcher aussi bien avec le nom qu'avec le handle. D'ailleur concretement, c'est quoi un handle ? Une sorte d'identifiant je cois. Mais sous quelle forme ?

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu veux, à partir d'un processus en mémoire, en lancer un second ?
    Ben, tu peux en effet récupérer l'ID du processus, puis récupérer le chemin de l'exécutable, mais quel intéret ?

    Enfin, pour récupérer un ID de processus à partir d'une de ses fenêtres : GetWindowThreadProcessId() (mais c'est pas sûr que ça marche pour des consoles: c'est à vérifier)
    Et pour retrouver le chemin de l'exécutable, je ne vois pas trop à part CreateToolHelp32Snapshot() et Process32First().

    (Ne pas prendre de "raccourcis" avec GetWindowModuleFileName(), tu pourrais te retrouver avec le chemin d'une DLL)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    Non non, je ne dois pas m'exprimer très bien.
    Dans le menu démarer, tu à un bidule 'Exécuter'. Tu tape par exemple 'cmd.exe' et la tadaaaa ca ouvre l'invité de commande.
    Je voudrais faire un prog équivalent à ca. On a une boîte de dialogue dans laquelle on entre un nom d'executable, pour reprendre notre exemple 'cmd.exe'. On valide et..que se passe-t'il ?
    Je parlais d'un gestionnaire des tâche.

  7. #7
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    ShellExecute( NULL, "open", "cmd.exe", 0, NULL, SW_SHOWNORMAL );
    Comme ceci ?

    Il suffit de récupérer le texte dans l'Edit et le mettre en 3éme paramétre alors.
    L'itération est humaine; la récursion, divine.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 193
    Points : 65
    Points
    65
    Par défaut
    ha...bah oui c'est ca. Merci.

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

Discussions similaires

  1. executer une application dans une tform existante
    Par MarcS dans le forum Delphi
    Réponses: 2
    Dernier message: 30/10/2006, 16h14
  2. Executer une application a partir d'un formulaire
    Par ibticeme dans le forum IHM
    Réponses: 36
    Dernier message: 26/10/2006, 22h16
  3. [WinDev] Est-il possible d'executer une application Win32 dans un site ?
    Par ran_hery dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 22/09/2006, 14h41
  4. executer une application a distance : Sockets ? RPC ? CORBA?
    Par a_hic dans le forum Développement
    Réponses: 5
    Dernier message: 30/05/2006, 13h02
  5. Réponses: 5
    Dernier message: 20/02/2006, 14h11

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