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 :

Problème pour rendre la main avec la fonction System() sous Windows


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 13
    Par défaut Problème pour rendre la main avec la fonction System() sous Windows
    Bonjour à tous,

    J'ai crée un programme en C++ pour savoir qui utilise un logiciel en particulier sur le réseau en écrivant la liste des utilisateurs en cours dans un fichier texte sur une ressource partagée. Au lieu de lancer le programme via le raccourci habituel, j'ai un fichier .ini qui contient le nom d'utilisateur et la commande à lancer (qui est lancée avec System()). Je précise que la commande doit être libre (dans le fichier ini) et ne pas être en dur dans le code C++, notamment s'il y a des arguments, à ne pas coder dans le code C++, tout doit se passer au niveua du fichier .ini.

    Sous Linux, mon programme fonctionne parfaitement, il inscrit l'utilisateur dans le fichier journal, lance le programme, et quand on quitte le programme, il enlève l'utilisateur du fichier journal.

    Seulement, le but est de le faire fonctionner sous Windows (je l'ai compilé sous Visual Studio) et quand je lance la commande avec System("C:\Windows\System32\calc.exe") par exemple, il rend la main, comme si on lançait la commande avec le "&" final sous Linux, ce qui est le comportement par défaut sous Windows. Y a-t-il moyen que System() attende la fin du processus lancé au lieu de rendre tout de suite la main ?

    Merci.

    Jérôme.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 503
    Par défaut
    Franchement, je trouve votre "solution" très bricolé.
    Pour une solution sous Windows au niveau du domaine entier, WMI est ton ami:
    https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

    Si vous utilisez cette cochonnerie de "system" de Win32, lisez la documentation ATTENTIVEMENT (vous verrez bien que c'est de la m....).
    https://msdn.microsoft.com/en-us/library/b4b6wz4t.aspx

    Vous êtes, en plus de mettre toute la sécurité du système en PLS, dépendant de l'interpréteur de commande de l'OS, qui est celui qui traine, GG.

    Quitte à faire du portable, POSIX est ton ami :
    https://msdn.microsoft.com/en-us/library/431x4c1w.aspx

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Sous Windows, tous les programmes qui ne sont pas des programmes Console rendent la main immédiatement. Pour lancer un processus et toujours en attendre la fin, il faut utiliser CreateProcess() et WaitForSingleObject(). Mais attention, ce n'est pas toujours fiable s'il y a déjà une instance du même programme qui tourne: Certains programmes contactent l'instance existante, lui disent d'ouvrir une nouvelle fenêtre, puis se terminent.
    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.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 13
    Par défaut
    Merci pour vos différentes réponses. J'assume le côté bricolé et peu sûr.

    Pour parler franchement, je ne sais pas comment mettre en œuvre CreateProcess() et WaitForSingleObject(), mais d'après mes essais il ne me semble pas que ça accepte des char * avec les arguments dedans, de même que la famille des fonctions exec() avec la dernière lettre qui change. En revanche, les bugs avec de multiples instances ne sont pas gênants.

    J'ai réussi à reproduire le comportement que je veux avec "start /wait c:\windows\system32\calc", mais une fois encapsulé dans une commande system(), ça rend quand même la main alors que lancé depuis une console, ça garde bien la main.

    Je veux bien une aide avec un bout de code si j'ai mal compris les explications.

    Merci.

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Quand on ne sait pas, on se renseigne ca évite les bêtises.
    Regarde donc la documentation

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 13
    Par défaut
    Ternel, J'ai suivi tes conseils, je me suis renseigné et j'ai regardé la doc suivante :

    https://msdn.microsoft.com/fr-fr/lib...(v=vs.85).aspx

    Donc j'ai mis dans mon programme le code suivant, largement copié-collé sans trop comprendre (j'ai dû caster mon char * en TCHAR * au passage, encore un type que je ne connaissais pas) :

    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));
     
    	CreateProcess(NULL,
    		(TCHAR *)("c:/windows/system32/calc.exe"),
    		NULL,           // Process handle not inheritable
    		NULL,           // Thread handle not inheritable
    		FALSE,          // Set handle inheritance to FALSE
    		0,              // No creation flags
    		NULL,           // Use parent's environment block
    		NULL,           // Use parent's starting directory 
    		&si,            // Pointer to STARTUPINFO structure
    		&pi);           // Pointer to PROCESS_INFORMATION structure
    Et à l'exécution, j'obtiens un magnifique :

    Exception non gérée*: System.AccessViolationException: Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.
    à CreateProcessW(Char* , Char* , _SECURITY_ATTRIBUTES* , _SECURITY_ATTRIBUTES* , Int32 , UInt32 , Void* , Char* , _STARTUPINFOW* , _PROCESS_INFORMATION* )
    à main(Int32 argc, SByte** argv) dans c:\users\jerome\documents\visual studio 2015\projects\quiutilise\quiutilise\quiutilise.cpp:ligne 155
    à _mainCRTStartup()

    Une idée ?

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

Discussions similaires

  1. fonction system() sous windows avec des blancs, des arguments, etc.
    Par eric1708 dans le forum Bibliothèques, systèmes et outils
    Réponses: 10
    Dernier message: 12/08/2014, 08h43
  2. Réponses: 2
    Dernier message: 13/08/2012, 14h12
  3. Réponses: 1
    Dernier message: 18/02/2012, 15h20
  4. Réponses: 9
    Dernier message: 29/04/2008, 13h38
  5. Réponses: 1
    Dernier message: 17/05/2004, 11h29

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