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

C++ Discussion :

[Parallèle] Problème d'execution d'une application avec CreateProcess


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 123
    Points : 142
    Points
    142
    Par défaut [Parallèle] Problème d'execution d'une application avec CreateProcess
    Bonjour,

    Après avoir longuement chercher sur le forum comment régler mon problème, j'ai aperçu de nombreux exemples d'utilisation de CreateProcess, et généralement ces derniers executent notepad.exe

    Dans mon cas le notepad se lancent très bien en utilisant CreateProcess... Mais dès que je veux lancer l'application que je désire, "rien" ne se passe...

    En fait je peux voir apparaitre rapidement le nom de mon executable dans la liste des processus du Gestionnaire des taches, mais ensuite il disparait et paf le programme se termine...

    L'executable que je désire lancer et le Crayon Physics que l'on peut trouver un peu partout sur le net.

    Bien sur si je lance l'executable en dehors de mon programme, il se lance très bien...

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    STARTUPINFO         siStartupInfo;
    PROCESS_INFORMATION piProcessInfo;
     
     
    memset(&siStartupInfo, 0, sizeof(siStartupInfo));
    memset(&piProcessInfo, 0, sizeof(piProcessInfo));
    siStartupInfo.cb = sizeof(siStartupInfo);
    if(CreateProcess(MultiCharToUniChar("U:\\PFE\\Final Shixin\\Projet_SmartBoard\\Crayon\\crayon.exe"),NULL,0,0,FALSE,
                         DETACHED_PROCESS,0,0,                              
                         &siStartupInfo,&piProcessInfo) == FALSE)
    {
    // erreur
    }
    J'ai aussi tenté avec ShellExecute... Un avertissement de sécurité apparait et me demande si je veux vraiment executer le logiciel. Je lui confirme que oui... et rien ne se passe -_-" ...

  2. #2
    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
    Regarde s'il n'y a rien dans l'Event Log qui donnerait des infos sur l'erreur...
    Et aussi, utilise WaitForSingleObject() + GetExitCodeProcess() pour connaître la valeur de retour. Si c'est une valeur négative, convertis-la en hexadécimal, car c'est sûrement un code d'Exception Windows...
    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.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 123
    Points : 142
    Points
    142
    Par défaut
    J'ai récupéré la valeur de retour du process avec la méthode suivante:

    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
    STARTUPINFO si;
        PROCESS_INFORMATION pi;
        ZeroMemory( &si, sizeof(si) );
        si.cb = sizeof(si);
        ZeroMemory( &pi, sizeof(pi) );
        if( !CreateProcess( MultiCharToUniChar("U:\\PFE\\Final Shixin\\Projet_SmartBoard\\Crayon\\crayon.exe"), NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ) ) 
        {
            return 0;
        }
        WaitForSingleObject( pi.hProcess, INFINITE );
     
        DWORD retour;
        GetExitCodeProcess(pi.hProcess,&retour);
     
        CloseHandle( pi.hProcess );
        CloseHandle( pi.hThread );
     
    cout << retour << endl;
    Et il me renvoi un beau 0 ...

    Celà ne m'avance donc guère -_-...

    Que veux tu dire par l'Event log ?

  4. #4
    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
    Dans ce cas, je ne vois pas trop...
    Essaie en réglant le paramètre répertoire courant...

    PS: Je ne connais pas MultiCharToUniChar(), mais à mon avis, cet appel fait soit une écriture interdite, soit une fuite de mémoire.
    Et en plus il est inutile, vu que tu passes une chaîne littérale: tu peux directement passer TEXT("blabla")...
    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.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 123
    Points : 142
    Points
    142
    Par défaut
    Merci pour tes réponses ^^

    MultiCharToUniChar() me permet de résoudre les problèmes dûs à l'unicode et en particulier le problème du cast du char* en LPWSTR ou LPCWSTR.

    Si quelqu'un réussit à comprendre ce qui pourrait clocher dans mon code, celà me seraient d'un très grande utilité ^^

    Lorsque je lance l'application "crayon.exe" via une invite de commande, elle se lance trés bien. Peut-être y a-t-il moyen de feinter en lançant cmd.exe via le CreateProcess en lui passant en paramètre mon application crayon.exe...

    Mais je n'arrive pas a passer en parametre à cmd.exe les applications à lancer.

    Merci d'avance.

  6. #6
    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
    On se moque de cmd. Je t'ai dit le répertoire courant...
    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
        STARTUPINFO si = {0};
        PROCESS_INFORMATION pi = {0};
        si.cb = sizeof(si);
        if( !CreateProcess( TEXT("U:\\PFE\\Final Shixin\\Projet_SmartBoard\\Crayon\\crayon.exe"), NULL, NULL, NULL, FALSE, 0, NULL, TEXT("U:\\PFE\\Final Shixin\\Projet_SmartBoard\\Crayon"), &si, &pi ) ) 
        {
            return 0;
        }
        WaitForSingleObject( pi.hProcess, INFINITE );
     
        DWORD retour;
        GetExitCodeProcess(pi.hProcess,&retour);
     
        CloseHandle( pi.hProcess );
        CloseHandle( pi.hThread );
     
        cout << retour << endl;
    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.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 123
    Points : 142
    Points
    142
    Par défaut
    Eh bien je n'ai pas vraiment compris pourquoi ça fonctionne... mais ça fonctionne

    Je ne vois pas en quoi le fait de re-préciser le répertoire courant fasse que ça fonctionne ... Si tu peux m'expliquer ça, j'aurais moins l'air d'un noob quand on me demandera pourquoi ça fontionne ^^

    En tout cas un grand merci à toi Médinoc

  8. #8
    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
    Parce qu'il y a beaucoup de programmes qui cherchent leurs fichiers de données dans le répertoire courant au lieu de chercher dans leur propre répertoire. D'autant que ce n'est pas évident sous nux...
    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.

Discussions similaires

  1. Problème d'execution d'une application en VB sous Win
    Par chebmo90 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 07/07/2009, 00h07
  2. problème d'execution d'une application QT
    Par white_fire dans le forum Qt
    Réponses: 5
    Dernier message: 10/03/2009, 22h20
  3. Problème de lancement d'une application avec JWS
    Par petiteminette44 dans le forum JWS
    Réponses: 1
    Dernier message: 11/08/2008, 14h41
  4. Réponses: 4
    Dernier message: 30/05/2008, 19h48
  5. Problème d'execution d'une application ASP
    Par pticasper dans le forum ASP.NET
    Réponses: 2
    Dernier message: 07/01/2008, 10h48

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