begin process at 2012 05 29 22:52:20
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

System

 > 

Lancer plusieurs commandes sur le même processus


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Lancer plusieurs commandes sur le même processus

jeudi 12 mars 2009 à 12:58:45 | Lancer plusieurs commandes sur le même processus

ZMJUVENTINO


Salut,
Je cherche comment lancer un processus d'invite de commande et y exécuter plusieurs commandes pas nécessairement
consécutives et sans utiliser des fichier batch comme si je travaille directement sur l'invite de commande.
Merci
foza juve
jeudi 12 mars 2009 à 14:14:14 | Re : Lancer plusieurs commandes sur le même processus

rt15

Membre Club Administrateur CodeS-SourceS
Salut,

CreateProcess de cmd /C :

#define UNICODE
#define _UNICODE

#include "windows.h"
#include "tchar.h"

DWORD __stdcall System_ShowLastError()
{
  DWORD nLastError;         /* Numéro de la dernière erreur                   */
  TCHAR* lpMessageBuffer;   /* Message d'erreur                               */

  /* Récupération du numéro de l'erreur */
  nLastError = GetLastError();

  /* Formatage du message */
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
                NULL, nLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (LPTSTR) &lpMessageBuffer, 0, NULL);

  /* Affichage du message et fin de l'appli */
  MessageBox(NULL, lpMessageBuffer, _T("ERROR"), MB_OK | MB_ICONERROR);

  LocalFree(lpMessageBuffer);
  return nLastError;
}

int main()
{
  PROCESS_INFORMATION processInfo;
  STARTUPINFO startupInfo;
  TCHAR lpCommandLine[50];
 
  // En unicode lpCommandLine doit être en read/write
  lstrcpy(lpCommandLine, _T("cmd /C ping 127.0.0.1"));

  ZeroMemory(&startupInfo, sizeof(startupInfo));
  startupInfo.cb = sizeof(startupInfo);
  startupInfo.dwFlags = STARTF_USESHOWWINDOW;
  startupInfo.wShowWindow = SW_SHOW; // Ou SW_HIDE pour cacher la fenêtre

  if (! CreateProcess(NULL, lpCommandLine,
                      NULL, NULL, FALSE, 0, NULL, NULL,
                      &startupInfo, &processInfo))
  {
    ExitProcess(System_ShowLastError());
  }

  CloseHandle(processInfo.hProcess);
  CloseHandle(processInfo.hThread);

  return 0;
}

Pour récupérer le résultat au fil de l'eau dans une fenêtre.
jeudi 12 mars 2009 à 15:36:01 | Re : Lancer plusieurs commandes sur le même processus

ZMJUVENTINO

Merci mais cela ne répond pas à mon besoin, moi je veux ouvrir une application qui marche sur l'invite des commandes ensuite appeler les fonctions de cette application.
Par exemple l'application s'appelle  "app" quand je lance le processus ça me donne
app>
pour accèder à l'aide
app>help
pour sortir
app>exit
c'est cela que je veux exécuter des commandes consécutives sur le même invite de commande.

foza juve
jeudi 12 mars 2009 à 20:30:28 | Re : Lancer plusieurs commandes sur le même processus

rt15

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
Aaaaaaaah. Ces temps ci je comprends tout de travers. Cela dit, mon lien te donnais une piste pour une solution. Voilà ce que ça me donnerait (A compiler en MBCS, mais pas trop de boulot pour convertir en unicode).


#include "windows.h"
#include "tchar.h"

DWORD __stdcall System_ShowLastError()
{
  DWORD nLastError;         /* Numéro de la dernière erreur                   */
  TCHAR* lpMessageBuffer;   /* Message d'erreur                               */

  /* Récupération du numéro de l'erreur */
  nLastError = GetLastError();

  /* Formatage du message */
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
                NULL, nLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (LPTSTR) &lpMessageBuffer, 0, NULL);

  /* Affichage du message et fin de l'appli */
  MessageBox(NULL, lpMessageBuffer, _T("ERROR"), MB_OK | MB_ICONERROR);

  LocalFree(lpMessageBuffer);
  return nLastError;
}

int main()
{
  PROCESS_INFORMATION processInfo;
  STARTUPINFO startupInfo;
  TCHAR lpCommandLine[50];
  HANDLE hPipeInputRead;
  HANDLE hPipeInputWrite;
  DWORD nNumberOfCharsWritten;
  TCHAR* lpHelpCommand = _T("help\n");
  TCHAR* lpQuitCommand = _T("quit\n");

  SECURITY_ATTRIBUTES securityattribs = {sizeof(SECURITY_ATTRIBUTES),NULL,TRUE};

  // En unicode lpCommandLine doit être en read/write
  lstrcpy(lpCommandLine, _T("netsh"));

  if (! CreatePipe(&hPipeInputRead,  &hPipeInputWrite, &securityattribs,  0)) System_ShowLastError();
  if (! SetHandleInformation(hPipeInputWrite, HANDLE_FLAG_INHERIT, 0)) System_ShowLastError();


  ZeroMemory(&startupInfo, sizeof(startupInfo));
  startupInfo.cb = sizeof(startupInfo);
  startupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
  startupInfo.wShowWindow = SW_SHOW; // Ou SW_HIDE pour cacher la fenêtre
  startupInfo.hStdInput = hPipeInputRead;
  startupInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
  startupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);

  if (! CreateProcess(NULL, lpCommandLine,
                      NULL, NULL, TRUE, 0, NULL, NULL,
                      &startupInfo, &processInfo))
  {
    ExitProcess(System_ShowLastError());
  }

  if (! WriteFile(hPipeInputWrite, lpHelpCommand, lstrlen(lpHelpCommand), &nNumberOfCharsWritten, NULL)) System_ShowLastError();
  if (! WriteFile(hPipeInputWrite, lpQuitCommand, lstrlen(lpHelpCommand), &nNumberOfCharsWritten, NULL)) System_ShowLastError();

  WaitForSingleObject(processInfo.hProcess, INFINITE);

  CloseHandle(processInfo.hProcess);
  CloseHandle(processInfo.hThread);

  CloseHandle(hPipeInputRead);
  CloseHandle(hPipeInputWrite);

  return 0;
}

jeudi 12 mars 2009 à 22:10:48 | Re : Lancer plusieurs commandes sur le même processus

ZMJUVENTINO

Merci beaucoup cher rt15 c'est ça que je cherche
cela dit j'ai besoin de quelques explications:
1-C'est quoi le MBCS , à ce que j'ai compris il s'agit d'un type de codage mais qu'est ce qu'il a de particulier ?

2-Quel est le rôle WaitForSingleObject(processInfo.hProcess, INFINITE); ?

3-Comment faire pour éxécuter c'est commandes en temps réel par exemple à partir d'une autre fenêtre ?

Merci  infiniment


foza juve
vendredi 13 mars 2009 à 00:09:48 | Re : Lancer plusieurs commandes sur le même processus

uaip

Réponse acceptée !
Salut,
google + "WaitForSingleObject" = 1er lien
Ca doit avoir le même effet que waitpid(); sous UNIX.

Sinon, pour répondre à ta question 3), euh... en remplaçant le main() par un nom de fonction quelconque, en incluant ce fichier (disons .cpp) dans ton projet et en appelant ladite fonction dans ton autre main, ça ne fonctionne pas ?

Cordialement, uaip.
vendredi 13 mars 2009 à 11:26:13 | Re : Lancer plusieurs commandes sur le même processus

rt15

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
1- Toutes les fonctions de Windows traitant des chaînes sont en deux versions, une travaillant sur des chaînes MBCS, l'autre sur des chaînes unicode. Un chaîne unicode doit être préfixée par L pour êter considérée comme unicode. Dans les fait on utilise _T() ou autre pour que le code compile en unicode ou MBCS. Je ne sais pas comment tu compiles, mais par défaut sous VC2005, c'est le jeu de caractère unicode qui est utilisé. Et il se trouve que mon programme ne fonctionne pas en unicode car WriteFile traite des données, pas une chaîne. Donc elle n'a pas de version unicode. Et moi je lui donne du unicode à écrire dans une console. Ca ne peut pas marcher.
Plus d'infos ici :
http://msdn.microsoft.com/en-us/library/c426s321(VS.80).aspx


3- Entre ce code et le code de mon lien du premier post, il y a l'écriture dans le flux d'entrée et la lecture du flux de sortie (Avec écriture dans une autre fenêtre). Donc il me semble que tu as tous les éléments pour faire tout et n'importe quoi.

Version compatible MBCS/unicode :

#include "windows.h"
#include "tchar.h"

DWORD __stdcall System_ShowLastError()
{
  DWORD nLastError;         /* Numéro de la dernière erreur                   */
  TCHAR* lpMessageBuffer;   /* Message d'erreur                               */

  /* Récupération du numéro de l'erreur */
  nLastError = GetLastError();

  /* Formatage du message */
  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
                NULL, nLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (LPTSTR) &lpMessageBuffer, 0, NULL);

  /* Affichage du message et fin de l'appli */
  MessageBox(NULL, lpMessageBuffer, _T("ERROR"), MB_OK | MB_ICONERROR);

  LocalFree(lpMessageBuffer);
  return nLastError;
}

int main()
{
  PROCESS_INFORMATION processInfo;
  STARTUPINFO startupInfo;
  TCHAR lpCommandLine[50];
  HANDLE hPipeInputRead;
  HANDLE hPipeInputWrite;
  DWORD nNumberOfCharsWritten;
  char* lpHelpCommand = "help\n";
  char* lpQuitCommand = "quit\n";

  SECURITY_ATTRIBUTES securityattribs = {sizeof(SECURITY_ATTRIBUTES),NULL,TRUE};

  // En unicode lpCommandLine doit être en read/write
  lstrcpy(lpCommandLine, _T("netsh"));

  if (! CreatePipe(&hPipeInputRead,  &hPipeInputWrite, &securityattribs,  0)) System_ShowLastError();
  if (! SetHandleInformation(hPipeInputWrite, HANDLE_FLAG_INHERIT, 0)) System_ShowLastError();


  ZeroMemory(&startupInfo, sizeof(startupInfo));
  startupInfo.cb = sizeof(startupInfo);
  startupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
  startupInfo.wShowWindow = SW_SHOW; // Ou SW_HIDE pour cacher la fenêtre
  startupInfo.hStdInput = hPipeInputRead;
  startupInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
  startupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);

  if (! CreateProcess(NULL, lpCommandLine,
                      NULL, NULL, TRUE, 0, NULL, NULL,
                      &startupInfo, &processInfo))
  {
    ExitProcess(System_ShowLastError());
  }

  if (! WriteFile(hPipeInputWrite, lpHelpCommand, lstrlenA(lpHelpCommand), &nNumberOfCharsWritten, NULL)) System_ShowLastError();
  if (! WriteFile(hPipeInputWrite, lpQuitCommand, lstrlenA(lpQuitCommand), &nNumberOfCharsWritten, NULL)) System_ShowLastError();

  WaitForSingleObject(processInfo.hProcess, INFINITE);

  CloseHandle(processInfo.hProcess);
  CloseHandle(processInfo.hThread);

  CloseHandle(hPipeInputRead);
  CloseHandle(hPipeInputWrite);

  return 0;
}

samedi 14 mars 2009 à 23:23:13 | Re : Lancer plusieurs commandes sur le même processus

ZMJUVENTINO

S'il vous plait j'ai pas compris l'utilité de WaitForSingleObject(processInfo.hProcess, INFINITE);
Après la première exécution mon application se plante.
Merci

foza juve
dimanche 15 mars 2009 à 11:23:02 | Re : Lancer plusieurs commandes sur le même processus

ZMJUVENTINO

Mon problème c'est que je veux lancer plusieurs commandes à partir de ma fenêtre à chaque fois que l'utilisateur appui sur un bouton, ces commandes doivent être exécuter sur le même processus qui est lancé au démarrage de mon application et non pas créer un nouveau processus à chaque fois qu'on veut exécuter une commande, alors avec ce code le problème que ça n'exécute la commande que après  la fermeture du handle du pipe, or quand je veux éxécuter une autre commande il me dit "identificateur invalide" vu que le pipe est fermé.
Y-a-t-il une méthode pour réouvrir le même handle ou existe-t-il une autre solution ?
Merci

foza juve
dimanche 15 mars 2009 à 14:17:10 | Re : Lancer plusieurs commandes sur le même processus

rt15

Membre Club Administrateur CodeS-SourceS
Si tu mets un MessageBox entre mes deux WriteFile, tu t'apercevras que la première command est traitée avant et la deuxième après que tu ais fermé la MessageBox.

  if (! WriteFile(hPipeInputWrite, lpHelpCommand, lstrlenA(lpHelpCommand), &nNumberOfCharsWritten, NULL)) System_ShowLastError();
  MessageBox(0, _T("Avant la fin"), _T("Ex"), MB_OK);
  if (! WriteFile(hPipeInputWrite, lpQuitCommand, lstrlenA(lpQuitCommand), &nNumberOfCharsWritten, NULL)) System_ShowLastError();

D'autre part, le WaitForSingleObject permet d'attendre la fin du processus netsh (provoquée par l'envoie de quit\n) avant de fermer les pipes. Donc ce n'est pas du tout la fermeture des pipes qui provoque l'exécution des commandes.

Il doit y avoir un souci dans ton code, mais difficile pour nous de le deviner...

1 2

Cette discussion est classée dans : lancer, commande, processus, commandes, invite


Répondre à ce message

Sujets en rapport avec ce message

executer une commande systeme [ par anthraxx ] bonjour,je voulais savoir si quelqu'un connait un moyen d'éxecuter des commandes su systemes d'exploitation sous Windows, et d'en récupérer l'output.I lancer une commande systeme sur un unix [ par Sioban ] Je souhaite lancer un commande systeme de type un "ls -l nom_du_fichier.dat" sur un serveur unix via mon PC(XP). (Pour avoir le nombre de ligne de cer Lancer un processus sous windows avec le nom d'utilisateur SYSTEM [ par logant83 ] Bonsoir, voila alors j'aimerai pouvoir lancer ma base MySQL quand je lance mon programme mais pour ce faire faut que je le mette dans les processus ma faire dépende un processus d'un autre [ par splifo ] Bonjour ! A partir d'une application Win32Application, je lance un exécutable grace a la commande createprocess(). Mais voilà, je voudrais que si on e Invite de commande [ par MadMax1024 ] Bonjour à tous.Voila ma question !J'ai développé un petit programme sous visual studio en c++ et je cherche une solution qui consisterai à ne pas   af Exécuter les commandes d'un fichier [ par Alongra ] Bonsoir/bonjour tout le monde !J'espère que vous allez bien et que cette nouvelle année à bien commencé pour vous !!Voilà, je dois réaliser un program Envoi commande AT [ par spirou91 ] Hello, Je cherche à faire communiquer mon gsm avec mon ordi. Pour ca, j'envoi des commandes AT à mon gsm. J'ai trouvé la source suivante: http://www. lancer une commande shell [ par mezzoben ] salut à tous , je voudrais savoir comment je pourrais lancer une commande shell à partir d'un prgramme C ainsi récupérer le resultat, merci [^^happ Problème : Mini Remote Shell [ par Abderrahmaine ] [^^happy10] Mini Remote Shell (mrsh) est une application client-serveur permettant d'exécuter des commandes sur une machine distante. Les commandes so commande invite [ par djenesis ] Stl a tous je voudrais quand m'aide à propos de ma commande invite qui ne reconnait aucune commande, avant il fonctionnait et la plus rien. En voici u


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,827 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales