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++Builder Discussion :

[Borland C++ Builder] Le DOS dans un cadre de la Form ?


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2012
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 32
    Par défaut [Borland C++ Builder] Le DOS dans un cadre de la Form ?
    Bonjour tout le monde,
    dans le cadre d'un projet simple, je voudrais exécuter une ligne de commande mais dont le résultat puisse être visualisé dans un cadre (un TEdit ???) de ma Form.
    Pour l'instant je fais un ShellExecute(0, 0, "xi_portable_Win.bat", 0, 0 , SW_SHOW );
    Celui-ci contient une requête vers un programme qui surveille de l'arduino, donc elle doit rester ouverte.
    Mais j'aimerais que le code qui apparaît sous DOS soit affiché dans un cadre et que je puisse fermer ce cadre pour faire sauter le processus comme quand je ferme la fenêtre DOS.

    Voilà ma liste au Père Noel
    Et je viens de passer un paquet d'heures à chercher sur le web....ben rien.

    Merci mille fois d'avance si quelqu'un a une piste....

  2. #2
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    Fait une recherche Google sur l'usage des PIPES
    tu trouveras beaucoup d'exemples aussi pour c++ Builder
    cdlt
    par exemple http://www.leunen.com/cbuilder/redirect.html
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  3. #3
    Membre averti
    Inscrit en
    Mai 2012
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 32
    Par défaut
    Merci des infos ! Mais je suis trop débutant pour comprendre quoi que ce soit à ces codes....mince !!!

  4. #4
    Membre averti
    Inscrit en
    Mai 2012
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 32
    Par défaut
    Après quelques mois de boulot mon projet a beaucoup avancé ! https://github.com/technologiescollege/s2a_fr
    En fait j'ai quasi fini...à part cette intégration du shell.

    Grâce à l'idée de DjmSoftware j'ai bien avancé en compréhension, MAIS j'ai un problème dans le CreateProcess.
    En effet je veux exécuter l'équivalent sous DOS de ".\Python\python.exe s2a.py COM13", mais je ne parviens pas à transmettre cette ligne dans CreateProcess, quelqu'un peut me demander de cette simple connerie ?

    Merci beaucoup.

  5. #5
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par défaut
    Salut
    le code suivant est parfaitement fonctionnel tu peux essayer de l'intégrer tout ou en partie dans ton code
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    bool __fastcall TForm1::CreateAndWaitUntilTerminated(char * PrgName, char* ParamList, long* Errorcode)
    {
      unsigned long ProcessResult;
      STARTUPINFO si;
      PROCESS_INFORMATION  pi;
      ZeroMemory(&si,sizeof(si));
      si.cb=sizeof(si);
      bool result=CreateProcess(PrgName,
                                ParamList,
                                NULL,
                                NULL,
                                false,
                                DETACHED_PROCESS,
                                NULL,
                                NULL,
                                &si,
                                &pi);
     if(!result)
      {
        *Errorcode=GetLastError();
        return false;
      }
      do
       {
        Sleep(50);
        Application->ProcessMessages();
        GetExitCodeProcess(pi.hProcess,
                           &ProcessResult);
       }
       while (ProcessResult==STILL_ACTIVE);
       CloseHandle(pi.hThread);
       CloseHandle(pi.hProcess);
       *Errorcode=ProcessResult;
       return true;
     
     
            //TODO: Add your source code here
    }
    cdlt
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  6. #6
    Membre averti
    Inscrit en
    Mai 2012
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 32
    Par défaut
    Merci ! Mais j'ai toujours des pb quand j'utilise mon code (que j'ai repiqué du lien que tu m'avais déjà mis) ou le tien, et je pense que c'est dû à mon appel à CreateProcess. Quand je clique sur un bouton je veux qu'il exécute ça :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    
      //create pipe for the console stdout
      SECURITY_ATTRIBUTES sa; 
      ZeroMemory(&sa,sizeof(SECURITY_ATTRIBUTES)); 
      sa.nLength=sizeof(SECURITY_ATTRIBUTES); 
      sa.bInheritHandle=true; 
      sa.lpSecurityDescriptor=NULL; 
      HANDLE ReadPipeHandle; 
      HANDLE WritePipeHandle;       // not used here
      if(!CreatePipe(&ReadPipeHandle,&WritePipeHandle,&sa,0)) 
    		RaiseLastWin32Error();
    
      //Create a Console 
      STARTUPINFO si; 
      ZeroMemory(&si,sizeof(STARTUPINFO)); 
      si.cb=sizeof(STARTUPINFO); 
      si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
      si.wShowWindow=SW_HIDE; 
      si.hStdOutput=WritePipeHandle; 
      si.hStdError=WritePipeHandle;
    
      PROCESS_INFORMATION pi;
      ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
      if(!CreateProcess(".\\s2a\\Python\\python.exe", ".\\s2a\\s2a.py COM13", NULL, NULL, false, 0, NULL, NULL, &si,&pi))
    	  RaiseLastWin32Error();
    
      //Read from pipe 
      char Data[1024]; 
      for (;;)
      {
        DWORD BytesRead; 
        DWORD TotalBytes; 
        DWORD BytesLeft; 
    
    	//Check for the presence of data in the pipe
        if(!PeekNamedPipe(ReadPipeHandle,Data,sizeof(Data),&BytesRead, 
            &TotalBytes,&BytesLeft))RaiseLastWin32Error(); 
        //If there is bytes, read them 
        if(BytesRead) 
        { 
          if(!ReadFile(ReadPipeHandle,Data,sizeof(Data)-1,&BytesRead,NULL)) 
              RaiseLastWin32Error(); 
          Data[BytesRead]='\0'; 
          Memo1->Lines->Add(AnsiString(Data)); 
    
        } 
        else 
        { 
          //Is the console app terminated? 
          if(WaitForSingleObject(pi.hProcess,0)==WAIT_OBJECT_0)break; 
    
        } 
      } 
      CloseHandle(pi.hThread);
      CloseHandle(pi.hProcess); 
      CloseHandle(ReadPipeHandle); 
      CloseHandle(WritePipeHandle);
    Merci mille fois de prendre le temps de me relire.

Discussions similaires

  1. [Langage/Algorithme] Récupérer le retour d'une commande MS-DOS dans une variable sous C++ Builder XE2
    Par Mercusyo dans le forum C++Builder
    Réponses: 7
    Dernier message: 21/03/2012, 09h41
  2. [Débutant] Borland C++ Builder : Portée du this, fonctions dans un formulaire, et espions
    Par otacon ghost dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/07/2011, 15h32
  3. [IDE] Manipulation de Date dans MysQl avec Borland C++ Builder 6
    Par KONAMIM dans le forum C++Builder
    Réponses: 3
    Dernier message: 08/03/2011, 21h20
  4. Réponses: 5
    Dernier message: 28/02/2006, 15h12
  5. Installer Synedit dans Borland C++ builder
    Par oliviereims dans le forum C++Builder
    Réponses: 19
    Dernier message: 24/02/2005, 19h38

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