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
    Nouveau membre du Club
    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
    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
    Nouveau membre du Club
    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
    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 : 62
    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
    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
    Nouveau membre du Club
    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
    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
    Nouveau membre du Club
    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
    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
    Nouveau membre du Club
    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
    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
    Nouveau membre du Club
    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
    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
    Nouveau membre du Club
    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
    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