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

Threads & Processus C++ Discussion :

Lancer un processus avec Createprocess, difficulté avec les arguments


Sujet :

Threads & Processus C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2011
    Messages : 7
    Points : 18
    Points
    18
    Par défaut Lancer un processus avec Createprocess, difficulté avec les arguments
    Bonjour !

    Ceci est ma première question sur ce forum, et j'en profite pour saluer toutes les personnes qui prennent le temps de se pencher sur les problèmes des débutants (comme moi) et moins débutants !

    Mon problème est le suivant :

    Je voudrais à partir de mon programme lancer une application (GSTARS2.1.exe). Ce programme, une fois ouvert et avant de pouvoir tourner nécessite que l'on lui rentre le nom du fichier de données (par exemple donnee.dat), le but est de ne pas avoir à rentrer manuellement le nom du fichier .dat chaque fois que l'on veut exécuter le .exe (au final il est dans une boucle et sera lancer plusieurs fois...donc fastidieux).

    J'ai lu la documentation de CreateProcess qui semble la fonction adaptée et j'ai écrit le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main()
    {
        STARTUPINFO si;         
        PROCESS_INFORMATION pi; 
        ZeroMemory(&si, sizeof(si));
        CreateProcess( "GSTARS2.1.exe ", "monu.dat", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);    
     
        return 0;
    }
    Ce code ouvre le programme GSTARS2.1 mais je dois encore écrire le fichier d'entrée à la main, comme si le "monu.dat" était un NULL.

    J'ai également essayé avec CreateProcess( NULL, "GSTARS2.1.exe monu.dat", ... (mais ça ne fonctionne pas non plus) ainsi que d'autre combinaison semblables qui me renvoient des messages d'erreur tels que "OPEN(monu.dat) not found".

    J'espère avoir expliqué clairement mon problème, si quelqu'un a une idée je le remercie d'avance !

    Bonne journée

    F

  2. #2
    screetch
    Invité(e)
    Par défaut
    CreateProcess( "GSTARS2.1.exe", "GSTARS2.1.exe monu.dat", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);aussi, StartupInfo a un champ size (cb en fait) que tu dois initialiser avec la taille de la structure

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2011
    Messages : 7
    Points : 18
    Points
    18
    Par défaut
    merci pour ta réponse,

    J'ai déjà essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CreateProcess( "GSTARS2.1.exe", "GSTARS2.1.exe monu.dat", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
    et ça me donne un résultat bizarre, comme si le programme s'ouvrait 2 fois mais j'ai le message "Stop - program terminated" à la fin.
    Pourrais-tu détailler L'initialisation de Startupinfo ? et à quoi correspond la taille de la structure ?

    encore merci !

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Il me semble que pour si, il faut en plus indiquer sa taille

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    STARTUPINFO si;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    PS : pour pi, il n'y a pas de reset ni d'initialisation nécessaire

    [EDIT] : pas vu la réponse de screetch, désolé
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2011
    Messages : 7
    Points : 18
    Points
    18
    Par défaut
    J'ai essayé en initialisant si comme vous me l'avez conseillé, mais ça ne résout pas le problème.

    Par contre il semblerait qu'en utilisant la fonction system ça fonctionne (le pgm tourne sans que j'ai besoin de lui donner le nom du fichier, je ne suis pas allé plus loin pour l'instant ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    system("nomDuProgramme.exe nomDuFichier.dat");
    Mais il me semble avoir lu que l'utilisation de "system" n'était pas terrible et pas recommandée (mais justement plutôt préférer Shellxecute ou createProcess), pourquoi ?

  6. #6
    screetch
    Invité(e)
    Par défaut
    system est effectivement pas recommandé
    bon, reprenons depuis le début; l'erreur "OPEN(monu.dat) not found" elle vient de GSTARS non?
    du coup ca veut bien dire que GSTARS a été ouvert et que l'argument est correct. En revanche, c'est le chemin de monu.dat qui n'irait pas.
    Dans ce cas, tu devrais donner le répertoire complet (option 1) ou bien donner une valeur au paramètre lpCurrentDirectory lorsque tu appelles CreateProcess

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2011
    Messages : 7
    Points : 18
    Points
    18
    Par défaut
    J'avais déjà essayé en mettant le repertoire complet mais ça ne changeait rien.

    Pourrais tu préciser quelle valeur je pourrait donner au paramètre lpCurrentDirectory ?
    A partir de la doc j'ai cru comprendre qu'il fallait mettre le chemin d'accès complet, quelque chose comme "C:\\Users...\\GSTARS2.1.exe", mais en essayant ce genre de chose ça ne marche pas non plus.

  8. #8
    screetch
    Invité(e)
    Par défaut
    "ca ne marche pas" ce n'est pas trés clair;
    essaye de préciser:

    * ou ca ne marche pas (est-ce que c'est CreateProcess qui ne marche pas ou bien est-ce que c'est GStars?)
    * ce qui ne marche pas (le programme ne se lance pas, se lance, mais n'ouvre pas le fichier, CreateProcess retourne une erreur...)

    ensuite, un par un:
    * si GStars est lancé, ca veut dire que CreateProcess marche. Si il est pas lancé, le premier truc a faire c'est de réussir a le lancer
    * lorsqu'on reussit a le lancer alors c'est a GStars de marcher.

    CreateProcess retourne un BOOL ou des codes d'erreur, essaye d'afficher les codes d'erreurs si possible (la doc dit d'appeler GetLastError en cas d'erreur)



    le current directory c'est le repertoire corant en francais, le repertoire ou l'on peut trouver les fichiers. Je ne te demandes pas d'utiliser le chemin complet pour GStars mais pour ton fichier dat, ou de donner en paramètre CurrentDirectory le chemin ou on peut trouver ton fichier dat.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2011
    Messages : 7
    Points : 18
    Points
    18
    Par défaut
    Bonjour, quelques précisions :

    *Avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CreateProcess( NULL, G:\\Users\\...test\\bin\\Debug\\GSTARS2.1.exe monu.dat",  NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)
    j'ai le résultat le plus proche de ce que j'attends, c'est à dire que Gstars tourne avec le fichier monu (super !), par contre il doit y avoir un erreur toute bête, en effet, la console affiche 2 fois Gstars et ne fait le calcul que la 2eme fois (dur à expliquer, cf la pièce jointe)

    *Par contre il y a quelque chose qui me retourne le cerveau, le fonctionnement ou non dépend de l'emplacement des fichiers Gstars et monu (normal), mais de manière très bizarre (et c'est pour ça que je n'y arrivait pas hier), je vais essayer de l'expliquer clairement :

    - Pour que ça fonctionne, le monu.dat doit être dans le même dossier que le "project file" qui correspond à mon code (G:\...\test). Gstars peut etre dans ce dossier ou dans celui de l'executable du code (test\bin\Debug). Il me semblait que tout devait être dans celui de l'executable, sinon ça va poser problème si quelqu'un d'autre veut l'utiliser

    - lorsque les 2 fichiers sont dans le même dossier que l'executable de mon code (test\bin\Debug), Gstars s'ouvre mais j'ai l'erreur F6416 : OPEN(monu.dat)-file not found
    Tout ça avec la ligne de code ci-dessus (donc un chemin d'accès vers test\bin\Debug)

    - Pour aller plus loin, j'ai essayé en copiant les fichiers nécessaires dans un autre dossier, et cette fois ci ça fonctionne (monu est cette fois dans le même dossier que l'executable du code, ainsi que Gstars), avec la même bizarrerie (piece jointe).

    J'espère avoir été clair (j'ai fait ce que j'ai pu ^^)

    Merci !
    Images attachées Images attachées  

  10. #10
    screetch
    Invité(e)
    Par défaut
    lorsque tu lqnces ton executable le currentdirectory est par défaut celui de ton executable (pas celui de GStars ou quoi que ce soit)
    le fichier nonu.dat est donc recherché a partir de ce repertoire; si il est dans ce repertoire ca amrche, sinon ca ne marche pas.

    Comme tu ne veux pas dépendre de l'emplacement de ton executable, c'est pour ca que je te conseille de mettre le parametre lpCurrentDirectory; ce parametre va changer le repertoire courant et la recherche de monu.dat va s'effectuer a partir de ce repertoire.
    Donc comme dit plus haut tu devrais rajouter ce parametre dans createProcess, donne lui le repertoire ou trouver monu.dat.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2011
    Messages : 7
    Points : 18
    Points
    18
    Par défaut
    lorsque tu lqnces ton executable le currentdirectory est par défaut celui de ton executable (pas celui de GStars ou quoi que ce soit)
    Tout à fait d'accord, c'est justement pour cela que je ne comprends pas pourquoi le fichier monu n'est pas trouvé alors que je l'ai mis exprès dans le même dossier que l'executable.
    Même en mettant ce qu'il faut dans le parametre lpCurrentDirectory le fichier n'est pas trouvé.

    Comme tu ne veux pas dépendre de l'emplacement de ton executable
    en fait justement je voudrais que ça fonctionne lorsque tout est au même endroit (plus pratique je trouve)

    Mais bon comme je l'ai dit ça fonctionne lorsque je copie tout ailleurs (c'est à dire l'executable, l'executable de Gstars et monu.dat dans le même dossier), un peu frustrant quand même...

  12. #12
    screetch
    Invité(e)
    Par défaut
    ah pardon, en debugging sous visual studio, le current directory est celui du _projet_ pas de l'executable.

    et le lpCurrentDirectory que tu as devrait dans ce cas pointer sur le repertoire de l'executable, pour corriger ca.

    Note que même si ils sont tous dans le même repertoire, le plus robuste serait d'extraire le chemin de l'executable (en utilisant argv[0]) et de donner ca a lpCurrentDirectory. C'est comme ca que l'on a la garantie forte "ca marche si le fichier dat est dans le même repertoire que l'executable"

  13. #13
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2011
    Messages : 7
    Points : 18
    Points
    18
    Par défaut
    Problem solve !

    L'info sur le debugging m'a bien soulagé aussi (je commençais a craquer ^^)

    j'ai également utilisé argv[0] comme tu me l'as conseillé (quelques subtilités quand même, pas si évidentes pour un novice) et ça fonctionne (faudra que je regarde un peu plus en détails pour être sur d'avoir tout compris mais a priori c'est bon)

    Je posterait un peu plus de détails plus tard, ça pourra sans doute aider des gens (mais ce soir je n'ai plus mon ordi avec le code a disposition)

    Un grand merci pour votre aide et tous vos conseils ! je reviendrai

    [EDIT] Pour ceux que ça pourrait interesser :

    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);

    string str = argv[0];
    str.erase(str.end()-8,str.end());

    size_t size = str.size() + 1;
    char* chemin = new char[ size ];

    strncpy( chemin, str.c_str(), size );

    CreateProcess( NULL, "GSTARS2.1.exe monu.dat", commandeNULL, NULL,FALSE, 0, NULL,hemin, &si,&pi);

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/04/2014, 17h06
  2. Difficulté avec shell, ou avec Firefox
    Par grrd dans le forum Access
    Réponses: 1
    Dernier message: 01/04/2014, 22h12
  3. processus en arriere plan avec CreateProcess()
    Par evlan dans le forum Windows
    Réponses: 1
    Dernier message: 08/02/2007, 19h24
  4. [C#] Difficulté avec les catch
    Par Roach- dans le forum ASP.NET
    Réponses: 9
    Dernier message: 31/01/2006, 17h57
  5. lancer un batch avec CreateProcess et le réduire !!
    Par hijodelanoche dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 25/01/2006, 14h40

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