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 :

appel à system() sans ouverture de la console


Sujet :

C

  1. #1
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut appel à system() sans ouverture de la console
    Bonjour,

    Je voudrais pouvoir faire appel à la fonction system() de manière discrète.
    Je m'explique :

    Lorsque je fais par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    system("mkdir test");
    La fenetre cmd s'ouvre une fraction de seconde
    J'aimerais qu'elle ne s'ouvre pas du tout.

    J'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char cmd[128];
     
    strcpy(cmd,"@echo off\n");
    strcat(cmd,"mkdir test");
    system(cmd);
    La fenetre ne s'ouvre pas car la commande n'est pas reconnue : mon dosser test n'est pas créé

    Merci pour votre aide
    Sorry

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par sorry60
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char cmd[128];
     
    strcpy(cmd,"@echo off\n");
    strcat(cmd,"mkdir test");
    system(cmd);
    Horrible !

    Utilise plutôt mkdir(), c'est POSIX.1 donc très portable.

  3. #3
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Horrible !

    Utilise plutôt mkdir(), c'est POSIX.1 donc très portable.
    Oui mais mkdir c'est juste un exemple.
    Le but est un shell, donc j'utilise system(), mais je ne veux pas te cette satanée fenetre noire qui s'ouvre derriere à chaque commande

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par sorry60
    Oui mais mkdir c'est juste un exemple.
    Le but est un shell, donc j'utilise system(), mais je ne veux pas te cette satanée fenetre noire qui s'ouvre derriere à chaque commande
    Un shell qui appelle un shell ? Quel intérêt ?

    Tu as qu'à faire system("cmd.exe") au début de ton code et c'est tout. Ou mieux :

    Demarrer > exécuter > "cmd.exe"

    Affaire réglée.

    Ou alors, tu écris en C chaque fonction du shell, c'est le but, non ? Tu cherches à tricher ?

  5. #5
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Peu importe que ce que je fais est sans interet ou pas, ce n'est pas ma question.

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Bonjour,

    Citation Envoyé par sorry60
    Peu importe que ce que je fais est sans interet ou pas, ce n'est pas ma question.
    Avez-vous essayé avec la fonction CreateProcess en (entre autres) mettant la valeur SW_HIDE dans le champ "wShowWindow" de la structure STARTUPINFO ?

    Evidemment, ce n'est pas portable...mais le problème ne l'est peut-être pas non plus...

    Cordialement,
    DS.

  7. #7
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Je vais essayer.

    Le programme est pour windows.

  8. #8
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Cette fonction a l'air de servir pour ouvrir des programmes.

    Mon projet est un remote shell, donc que des commandes shell de base (cd, mkdir, del, etc..), j'utilise donc system(), mais le problème c'est la fenetre noire qui s'ouvre derrière

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Bonsoir,

    Citation Envoyé par sorry60
    Cette fonction a l'air de servir pour ouvrir des programmes.
    Exact.

    Citation Envoyé par sorry60
    Mon projet est un remote shell, donc que des commandes shell de base (cd, mkdir, del, etc..),
    Rappel, au cas où (inutile de me dire "je le savais déjà" [1]) : les "commandes shell de base", comme vous dites, sont interprétées par "cmd.exe".
    Question(s) : qu'est-ce qui est primordial dans votre projet ?
    Le côté "remote" ou le côté "shell" ?
    Si c'est le côté "remote", alors vous pouvez très bien lancer "cmd.exe" (cf. ma réponse + une de celles d'Emmanuel).
    Si c'est le côté "shell", alors il va falloir implémenter vous-même les commandes (cf. autre réponse d'Emmanuel).

    Citation Envoyé par sorry60
    j'utilise donc system(), mais le problème c'est la fenetre noire qui s'ouvre derrière
    La "fenêtre noire qui s'ouvre derrière" est ouverte par..."cmd.exe", non ?
    D'où l'idée d'utiliser CreateProcess pour que la fenêtre ne soit pas affichée...
    Evidemment, vous n'êtes pas obligé de lancer un "bête" "cmd.exe" : vous pouvez le lancer avec les paramètres qui vous permettront de n'exécuter que LA commande qui vous intéresse.

    Cordialement,
    DS.

    [1] : c'est pour ça que j'ai précisé "au cas où"

  10. #10
    Membre éclairé Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Par défaut
    Citation Envoyé par David.Schris
    Question(s) : qu'est-ce qui est primordial dans votre projet ?
    Le côté "remote" ou le côté "shell" ?
    Le côté remote.

    Citation Envoyé par David.Schris
    Si c'est le côté "remote", alors vous pouvez très bien lancer "cmd.exe" (cf. ma réponse + une de celles d'Emmanuel).
    Oui mais dans ce cas, la fenetre cmd va s'ouvrir coté distant.

    Citation Envoyé par David.Schris
    La "fenêtre noire qui s'ouvre derrière" est ouverte par..."cmd.exe", non ?
    Oui.

    Citation Envoyé par David.Schris
    D'où l'idée d'utiliser CreateProcess pour que la fenêtre ne soit pas affichée...
    Evidemment, vous n'êtes pas obligé de lancer un "bête" "cmd.exe" : vous pouvez le lancer avec les paramètres qui vous permettront de n'exécuter que LA commande qui vous intéresse.
    Ok je comprends un peu mieux, par exemple : "cmd.exe cd .." ?
    Mais dans ce cas, comment récuperer le resultat de la commande pour le renvoyer au serveur (par exemple le resultat d'un "cmd.exe dir") ?

    Merci pour votre aide, je n'avez pas bien compris votre 1er post.

  11. #11
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    (re)Bonsoir,

    Citation Envoyé par sorry60
    [...] Ok je comprends un peu mieux, par exemple : "cmd.exe cd .." ?
    Dans ce genre là, oui. Commencez par
    Citation Envoyé par sorry60
    Mais dans ce cas, comment récuperer le resultat de la commande pour le renvoyer au serveur (par exemple le resultat d'un "cmd.exe dir") ?
    Je vous ai précédemment donné des liens. L'un d'eux concernait la structure STARTUPINFO. Parmi ses membres, on trouve "hStdInput", "hStdOutput" et "hStdError" : ils permettent de spécifier où le processus créé va lire/écrire quand il utilisera les entrée/sorties standard.
    Ce qu'il est courant de faire :
    - création d'un (ou plusieurs) tube(s) (fonction CreatePipe si ma mémoire est bonne) au moins pour récupérer la sortie ;
    - transmission du/des "handle(s)" du/des tube(s) a CreateProcess via le membre hStdOutput (et plus si affinités) de la structure STARTUPINFO (à vous de voir ce que vous comptez faire avec hStdError et si vous voulez utiliser hStdInput, par exemple pour envoyer des données à une commande) ;
    (si tout va bien, le processus s'exécute et écrit dans le tube)
    - lecture du résultat à "l'autre extrémité" du tube.
    Bien sûr, il est possible de créer un thread (fonction CreateThread) dédié à la lecture dans le tube pour récupérer ce qui y est écrit au fur et à mesure (i.e. : ne pas avoir à attendre la fin de l'exécution du processus (fonction WaitForSingleObject) pour commencer à lire).

    Cordialement,
    DS.

Discussions similaires

  1. Réponses: 6
    Dernier message: 12/11/2014, 08h46
  2. commande system sans interruption du script appelant
    Par alex77722 dans le forum Langage
    Réponses: 7
    Dernier message: 25/01/2013, 09h19
  3. [Système][Appel system linux]Différence dossier /link
    Par busta28 dans le forum Général Java
    Réponses: 5
    Dernier message: 16/04/2005, 22h00
  4. Ré-installation (du systeme) sans formatage, possible ?
    Par __fabrice dans le forum Administration système
    Réponses: 11
    Dernier message: 11/04/2005, 12h32
  5. redirection operateur flue >> appel system
    Par philippe V dans le forum MFC
    Réponses: 9
    Dernier message: 16/03/2005, 18h01

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