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 :

commande sans console avec sortie fichier : system VS WinExec VS _popen VS CreateProcess


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut commande sans console avec sortie fichier : system VS WinExec VS _popen VS CreateProcess
    Salut,

    J'utilise Code::Blocks et j'ai créé un projet GUI et non console parce que je veux que mon programme s'exécute en arrière plan
    Dans mon programme, j'aimerais exécuter cette commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    curl -F "api_key=XXX" -F "filetype=mp3" -F "track=@sound.mp3" "http://developer.echonest.com/api/v4/track/upload" > info.txt
    Avec ces exigences : ne pas voir de console (même pendant une demi-seconde) et créer le fichier info.txt qui collecte la sortie de la commande.

    J'ai essayé 4 fonctions :

    system():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    system("curl -F \"api_key=XXX\" -F \"filetype=mp3\" -F \"track=@sound.mp3\" \"http://developer.echonest.com/api/v4/track/upload\" > info.txt");
    crée le fichier mais affiche la console pendant toute l’exécution de la commande avec les détails de l’exécution


    WinExec():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WinExec("curl -F \"api_key=XXX\" -F \"filetype=mp3\" -F \"track=@sound.mp3\" \"http://developer.echonest.com/api/v4/track/upload\" > info.txt",SW_HIDE);
    n'affiche pas la console mais ne crée pas le fichier


    _popen():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _popen("curl -F \"api_key=XXX\" -F \"filetype=mp3\" -F \"track=@sound.mp3\" \"http://developer.echonest.com/api/v4/track/upload\" > info.txt","r");
    crée le fichier mais affiche la console vide pendant 2 à 3 seondes


    CreateProcess():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CreateProcess(NULL, "curl -F \"api_key=XXX\" -F \"filetype=mp3\" -F \"track=@sound.mp3\" \"http://developer.echonest.com/api/v4/track/upload\" > info.txt",NULL, NULL,FALSE,CREATE_NO_WINDOW,NULL,NULL,&si,&pi );
    n'affiche pas la console mais ne crée pas le fichier


    Je vous remercie d'avance pour votre contribution

  2. #2
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    ok, I found a way, avec... CreateProcess :

    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
        PROCESS_INFORMATION procinfo = {0};
        STARTUPINFO startupinfo = {0};
        ZeroMemory( &startupinfo, sizeof(startupinfo) );
        startupinfo.cb = sizeof(startupinfo);
        startupinfo.dwFlags |=STARTF_USESTDHANDLES ;
        startupinfo.hStdInput=GetStdHandle(STD_INPUT_HANDLE);
        startupinfo.hStdError=GetStdHandle(STD_ERROR_HANDLE);
        SECURITY_ATTRIBUTES sa;
        ZeroMemory( &sa, sizeof(sa) );
        sa.nLength=sizeof(sa);
        sa.bInheritHandle=TRUE;
        startupinfo.hStdOutput=CreateFile ("info.txt", GENERIC_READ|GENERIC_WRITE, 0, &sa, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
        CreateProcess(NULL,"curl -F \"api_key=XXX\" -F \"filetype=mp3\" -F \"track=@sound.mp3\" \"http://developer.echonest.com/api/v4/track/upload\"", NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &startupinfo, &procinfo);
        Sleep(14000);
        CloseHandle(startupinfo.hStdOutput);
    note : j'ai fais un Sleep (14000) puisque je sais que ma commande ne dépassera pas les 12 secondes.

  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
    Utilise WaitForSingleObject(procinfo.hProcess, INFINITE) plutôt qu'un Sleep().
    Et aussi, il te manque deux CloseHandle():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CloseHandle(procinfo.hProcess);
    CloseHandle(procinfo.hThread);
    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. Exécuter fichier.sql avec requete sans console PostgreSQL
    Par fidepaix dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 11/12/2013, 09h42
  2. Installation de Access 97 avec Vista - fichier system.mdw
    Par baronalain dans le forum Access
    Réponses: 7
    Dernier message: 30/11/2007, 10h04
  3. lancer une commande sans console?
    Par alain57 dans le forum C
    Réponses: 4
    Dernier message: 15/08/2006, 14h07
  4. Réponses: 25
    Dernier message: 05/07/2006, 16h46
  5. Copie d'un fichier sans montage avec Samba
    Par jean-jacques varvenne dans le forum Réseau
    Réponses: 5
    Dernier message: 14/07/2005, 11h31

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