redirection de sortie CreateProcessW - C++ - Programmation
Marsh Posté le 29-06-2012 à 11:52:04
Pour tes deux premiers memset, perso, je ferais memset(&siStartupInfo, 0, sizeof(STARTUPINFO)) et memset(&piProcessInfo, 0, sizeof(PROCESS_INFORMATION)) mais c'est peut être juste une question de goûts.
A tout hasard, tu a essayé de faire un remplissage a zéro aussi pour le sécurity attribute?
SECURITY_ATTRIBUTES sa;
memset(&sa, 0, sizeof(SECURITY_ATTRIBUTES));
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = true;
A+,
Marsh Posté le 29-06-2012 à 11:53:51
D'après http://msdn.microsoft.com/en-us/li [...] 85%29.aspx et la doc, tu as mal initialise ton SECURITY_ATTRIBUTES:
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
Ensuite tu dis que si il ne rentre pas dans le if ligne 20, c'est que h doit avoir une autre valeur: il te suffit donc de lire la doc de createfile() et de traiter tous les cas d'erreur (utilise la fonction ErrorExit() du lien ci dessus pour voir un descriptif de l'erreur)
edit: grilled!
Marsh Posté le 29-06-2012 à 11:56:00
A moitié grilled, le temps que j'ajoute une ligne d'initialisation manquante ( sa.nLength = sizeof(SECURITY_ATTRIBUTES); ) tu avais posté
A+,
Marsh Posté le 29-06-2012 à 14:55:15
Merci pour la correction Ça marche mieux mais il y a encore un petit truc que je n'arrive pas à cerner je sais pas si vous auriez une idée ^^ :
quand le programme lancé est : "psexec \\monpc ipconfig", le programme reste bloqué sur WaitForSingleObject( , ), le processus semble ne pas se finir...
alors que quand je fais "psexec \\monpc echo && ipconfig" tout se passe bien !
(je précise que ça ne vient pas de psexec a priori, ces commandes marchent très bien dans l’interpréteur de Windows).
Étant donné que ça ne vient pas forcément du code, je peux m'arranger pour ajouter simplement "echo && " au début de chaque commande au pire
Code :
|
Merci quand même si vous avez quelque intuition passagère
Marsh Posté le 29-06-2012 à 15:46:56
Est ce que \\monpc est bien l'ordinateur local? Si oui pourquoi le précises- tu?
Pour le reste, pas d'idée...
Marsh Posté le 29-06-2012 à 16:54:24
en fait je viens de réaliser que en écrivant :
psexec \\monpc.corp.lan echo && ipconfig
... ça marche ... mais la commande ipconfig est exécutée sur mon pc a moi et non a distance x) en fait ça marche pas mieux avec le echo && (c'était un peu zarb après tout ^^)
donc ainsi aucune commande ne passe mais j'ai quand même quelques résultats dans mon fichier de log :
Code :
|
alors que la commande donne ça
Code :
|
La commande bloque à mi-chemin je ne sais pas trop pourquoi mais ca semble lié à PSExec (psinfos marche très bien )
Marsh Posté le 29-06-2012 à 09:21:32
Plop !
J'ai un petit problème en ce moment, je fais tourner un programme qui fait appel à la fonction CreateProcess pour lancer des programmes en ligne de commande externes. Pour récupérer la sortie de ces programmes, jusqu'à présent je lançais "CMD /C commande.exe >> c:\logs.txt", de cette façon, je peut récupérer les sorties des programmes ... sauf que cette sortie n'inclut pas tout ce qu'on voit quand on lance la commande dans le cmd de windows ... J'ai besoin d'accéder au flux d'erreurs stdErr ... Sur Java, j'avais juste besoin de faire à un moment un truc comme process.redirectErrorStream(true).
J'ai cherché sur c++ et je suis tombé sur ça entres autres, et j'ai essayé de faire un mix de tout, ou même d'en mettre le minimum, mais ça ne marche désespérément pas x)
avec un "cout", j'ai remarqué que le programme n'entrait même pas dans "if(h != INVALID_HANDLE_VALUE)", donc il y a au moins un bug avant ça.
J'ai du surement mal initialiser mon HANDLE, mais je vois pas trop comment ...
Je mix des choses qui me paraissent logiques mais au fond je comprends pas assez pour résoudre les bugs s'il y en a qui surviennent x) Des DWORD, des HANDLE, des STARTUPINFO, ... charabia tout ça!
merci d'avance
Message édité par gilou le 29-06-2012 à 11:42:30