Accueil > Forum > > > > Lancer plusieurs commandes sur le même processus
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
|
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
|
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 lienCa 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
|
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
|
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...
|
|
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
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|