executer un programme de cygwin dans l'environnement windows

executer un programme de cygwin dans l'environnement windows - C - Programmation

Marsh Posté le 07-07-2009 à 14:46:35    

Sujet :
demande renseignement plus détaillé sur la fonction createprocess dont la doc msdn est à l'adresse suivante :
http://msdn.microsoft.com/en-us/li [...] S.85).aspx
 
Problème:
J'utilise cygwin et lorsqu'on fait sous cygwin un :
"cmd /c set"  
on obtient des variables d'environnements différentes que lorsqu'on fait sous windows (win+R => "cmd" ) :
set
 
logique car cygwin surcouche API de windows. Ne me demander pas pourquoi (trop complexe) mais j'ai une exigence de vouloir exécuter un .bat de cygwin dans l'environnement wiindows ! comment fait-on ?
 
je pense utiliser un programme du genre :

Code :
  1. #include <windows.h>
  2. #include <process.h>
  3. #include <stdio.h>
  4. int main()
  5. {
  6.     STARTUPINFO    si;
  7.     PROCESS_INFORMATION  pi;
  8.     GetStartupInfo(&si);
  9.     CreateProcess(NULL, "cmd /c set",  // Name of app to launch
  10.   NULL,      // Default process security attributes
  11.   NULL,      // Default thread security attributes
  12.   FALSE,      // Don't inherit handles from the parent
  13.   0,      // Normal priority
  14.   NULL,      // Use the same environment as the parent
  15.   NULL,      // Launch in the current directory
  16.   &si,      // Startup Information
  17.   &pi);      // Process information stored upon return
  18.     printf("Done.\n" );
  19.     exit(0);
  20.     return 0;
  21. }


ce programme crée un process qui lance dans une fenetre ms-dos le fameux "set". Cependant l'environnement reste le même que le process parent. Je pense que le 7eme parametre de la fonction "CreateProcess" permet de changer d'environnement.
 
un petit conseil de geek SVP ! :bounce:  :bounce:  :bounce:  :bounce:


Message édité par BinItsMeKoi le 09-07-2009 à 10:33:37
Reply

Marsh Posté le 07-07-2009 à 14:46:35   

Reply

Marsh Posté le 07-07-2009 à 16:02:49    

tes variables d'environnements que tu définis avec set sont uniquement pour le process courant et éventuellement les processus fils (suivant la manière dont on les crée) c'est vraiment ce que tu veux ?
Si tu doubles cliques sur un programme par la suite, que tu lances ton set dans cygwin ou non, le programme que tu lances n'en aura pas conscience
 
Edit : En tout cas, ta demande ne me parait vraiment pas claire ... Si tu veux mettre en place des variables d'environnement, c'est certain que tu auras moyen de le faire directement via l'api de windows, sans passer par un interpréteur de commandes

Message cité 1 fois
Message édité par theshockwave le 07-07-2009 à 16:04:35

---------------
last.fm
Reply

Marsh Posté le 07-07-2009 à 16:21:24    

Je plussoie.
Utiliser SetEnv() ou SetEnvironmentVariable() depuis le programme C au lieu de lancer cmd.

Reply

Marsh Posté le 07-07-2009 à 16:31:48    

theshockwave a écrit :

tes variables d'environnements que tu définis avec set sont uniquement pour le process courant et éventuellement les processus fils (suivant la manière dont on les crée) c'est vraiment ce que tu veux ?
Si tu doubles cliques sur un programme par la suite, que tu lances ton set dans cygwin ou non, le programme que tu lances n'en aura pas conscience
 
Edit : En tout cas, ta demande ne me parait vraiment pas claire ... Si tu veux mettre en place des variables d'environnements, c'est certain que tu auras moyen de le faire directement via l'api de windows, sans passer par un interpréteur de commandes


 
as-tu suivi mes instructions ? si oui, tu as du voir que le "set" dans windows retourne des variables d'environnement différent qu'un "set" dans cygwin !!
moi ce que je veux c'est :
sans retourner dans l'environnement windows (soit dans cygwin) exécuter en ligne de commande mes .exe sans que l'interpréteur de commande de cygwin n'intervienne ! ainsi mes programmes s'executeront pareillement que si l'on passe par windows !
Je pense pour y arriver, créer un process et forcer son execution dans l'environnement windows ! Ce process ensuite sera charger d'exécuter mes programmes ! Tout ceci (j'insiste), sans quitter cygwin sinon je ne poserais pas la question :).  
 
En effet, cygwin ne sert à rien dans ce cas concret ! Mais je l'utilise avant (notamment en temps que gestionnaire de paquet...) !


Message édité par BinItsMeKoi le 07-07-2009 à 16:51:58
Reply

Marsh Posté le 07-07-2009 à 16:42:26    

olivthill a écrit :

Je plussoie.
Utiliser SetEnv() ou SetEnvironmentVariable() depuis le programme C au lieu de lancer cmd.


 
ok ok ! en gros tu me dis que si les variables d'environements de cygwin sont différentes de celles de windows faut que je redéfinisse l'environnement de cygwin pour qu'il soit comme celui de windows !  
C'est de la grosse bidouille :) ! Mais de toute facon je ne peux pas le faire car les programmes que je lance ne sont pas écrit par moi et les environnements, sur lesquels ces programmes fonctionnent, changent selon la becane !


Message édité par BinItsMeKoi le 07-07-2009 à 16:43:30
Reply

Marsh Posté le 07-07-2009 à 18:53:44    

Désolé, je n'avais pas compris que derrière ce changement de variables il y avait des lancements de programmes dont le code n'est pas modifiable.
 
Peut-être qu'une solution serait de générer un fichier ".bat", à la volée, qui aurait une définition des variables, suivi du lancement des autres programmes.

Reply

Marsh Posté le 08-07-2009 à 10:03:52    

olivthill a écrit :

Désolé, je n'avais pas compris que derrière ce changement de variables il y avait des lancements de programmes dont le code n'est pas modifiable.
 
Peut-être qu'une solution serait de générer un fichier ".bat", à la volée, qui aurait une définition des variables, suivi du lancement des autres programmes.


 
c'est en effet l'une des dernières solutions a envisager car ca entraine trop de travail derrière (et reste un peu bricolage malgrès tout).  
=> Il doit forcément exister un moyen pour cygwin de SORTIR DE SON ENVIRONNEMENT emulé !!!???

Message cité 1 fois
Message édité par BinItsMeKoi le 08-07-2009 à 11:04:14
Reply

Marsh Posté le 08-07-2009 à 11:31:46    

BinItsMeKoi a écrit :


 
c'est en effet l'une des dernières solutions a envisager car ca entraine trop de travail derrière (et reste un peu bricolage malgrès tout).  
=> Il doit forcément exister un moyen pour cygwin de SORTIR DE SON ENVIRONNEMENT emulé !!!???


 
Du point de vue variables d'environnement, il n'y a pas vraiment d'émulation dans cygwin. Cygwin en définit juste quelques unes et tous les processus qu'il lance en héritent, c'est tout. Je ne comprends toujours pas quel est ton problème. Tu veux qu'il n'aie pas certaines variables d'environnement qui sont définies sous cygwin ?
 
Parce qu'en soit, si le programme que tu lances est un programme cygwin (linkant avec la DLL de cygwin) tu ne pourras pas l'empêcher de le faire quoi que tu fasses ... Et si le programme n'utilise pas cygwin, alors il n'y a pas de couche d'émulation, donc où est le souci ?


---------------
last.fm
Reply

Marsh Posté le 08-07-2009 à 12:08:03    

theshockwave a écrit :


 
Du point de vue variables d'environnement, il n'y a pas vraiment d'émulation dans cygwin. Cygwin en définit juste quelques unes et tous les processus qu'il lance en héritent, c'est tout. Je ne comprends toujours pas quel est ton problème. Tu veux qu'il n'aie pas certaines variables d'environnement qui sont définies sous cygwin ?
 
Parce qu'en soit, si le programme que tu lances est un programme cygwin (linkant avec la DLL de cygwin) tu ne pourras pas l'empêcher de le faire quoi que tu fasses ... Et si le programme n'utilise pas cygwin, alors il n'y a pas de couche d'émulation, donc où est le souci ?


 
je ne suis pas le seul sur ce problème et je te garantie qu'une dizaine de variables d'environnements sont écrasées par cygwin (sans parler des variables rajoutées on est d'accord). Le PATH par exemple fait parti des variables d'environnements ! Je ne peux me permettre de sauvegarder ces dernières car cygwin dans ce cas deviendrait instable !
 
ce sont des setup que je lance à partir de cygwin ! Toutes mes commandes hérite de cet environnement ! J'aimerai bien que "le programme n'utilise pas cygwin" mais à partir de cygwin est-ce possible !??  
Désolé que tu ne me comprennes pas ! Je pense pourtant être clair !


Message édité par BinItsMeKoi le 08-07-2009 à 12:17:19
Reply

Marsh Posté le 08-07-2009 à 12:24:22    

ok, là, je vois mieux :)


---------------
last.fm
Reply

Marsh Posté le 08-07-2009 à 12:24:22   

Reply

Marsh Posté le 08-07-2009 à 13:55:31    

theshockwave a écrit :

ok, là, je vois mieux :)


ouf ! mais ca n'avance pas le schmilblick ...  :wahoo:


Message édité par BinItsMeKoi le 08-07-2009 à 13:56:14
Reply

Marsh Posté le 08-07-2009 à 14:33:22    

Oui, l'idée serait donc de parvenir à retrouver les variables d'environnement "par défaut" de Windows (ou peut-être plutôt celles du processus parent de cygwin), mais en survolant la msdn, je n'ai vu ni de moyen de récupérer les variables d'environnement d'un process donné, ni de moyen de récupérer les variables d'environnement "par défaut (qui doivent être settées par utilisateur ...) peut-être que tu trouveras tout ca dans la base de registre, reste à savoir à quelle clé ... et que tu pourras construire toi-même la structure d'environnement à passer à ton CreateProcess (pour l'exemple, tu as un truc sympa là : http://msdn.microsoft.com/en-us/li [...] S.85).aspx )


---------------
last.fm
Reply

Marsh Posté le 08-07-2009 à 16:32:51    

theshockwave a écrit :

Oui, l'idée serait donc de parvenir à retrouver les variables d'environnement "par défaut" de Windows (ou peut-être plutôt celles du processus parent de cygwin), mais en survolant la msdn, je n'ai vu ni de moyen de récupérer les variables d'environnement d'un process donné, ni de moyen de récupérer les variables d'environnement "par défaut


 
cf. archives Google Groups : c'est la même méthode depuis ...Windows 95  (32-bits) !

Reply

Marsh Posté le 08-07-2009 à 17:52:03    

Stephen135 a écrit :


 
cf. archives Google Groups : c'est la même méthode depuis ...Windows 95  (32-bits) !


 
Stephen135=> heu ... peut-être as-tu une réponse plus développée à fournir parce que pour moi c'est un peu maigre ! sorry  :??:  
 
theshockwave=> génial ton lien ! Je creuse encore ...

Reply

Marsh Posté le 09-07-2009 à 10:31:59    

je n'y arrive toujours pas !  Y a t-il d'autres solutions ?

Reply

Marsh Posté le 09-07-2009 à 10:46:11    

je viens de regarder un peu, tu peux trouver les variables d'environnement utilisateur dans HKEY_CURRENT_USER/Environment dans la base de registre. Il te suffit de parcourir toutes les entrées dedans, j'imagine que tu devrais t'en sortir.
 
Apparamment, les variables d'environnement système sont dans HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/SessionManager/Environment et pareil, tu peux itérer sur les entrées ici. Normalement, en cumulant les deux et dans le bon ordre (d'abord les variables système, ensuite les variables utilisateur, j'imagine) tu dois pouvoir remplir ta structure correctement et la passer à ton process que tu crées.
 
Si tu as un souci, n'hésite pas à poser une question précise
 
Edit : petite précision qui peut être utile : ces entrées sont là sur mon XP 32 bits, je ne peux pas garantir qu'elles y seront sur une autre version de windows


Message édité par theshockwave le 09-07-2009 à 11:07:06

---------------
last.fm
Reply

Marsh Posté le 11-07-2009 à 16:34:08    

BinItsMeKoi a écrit :

Stephen135=> heu ... peut-être as-tu une réponse plus développée à fournir parce que pour moi c'est un peu maigre !


Sache que Stephen135 ne répond jamais aux réactions qu'il suscite. Il est surnommé "one-shot" ou "the missile".
 
En gros il considère que tout le monde est censé savoir consulter les archives de Usenet et qu'il faut se débrouiller avec...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 13-07-2009 à 18:47:32    

Emmanuel Delahaye a écrit :


tout le monde est censé savoir consulter les archives de Usenet et qu'il faut se débrouiller avec...


Et il a raison.
Plus personne ne fait l'effort de chercher sur google ou google groups maintenant.
Quand on voit des questions dont la réponse est immédiate par google, et qui date de 15 ou 20 ans...
 

Reply

Marsh Posté le 13-07-2009 à 19:34:26    

Pat333 a écrit :


Et il a raison.
Plus personne ne fait l'effort de chercher sur google ou google groups maintenant.
Quand on voit des questions dont la réponse est immédiate par google, et qui date de 15 ou 20 ans...
 


Ha ha ! Pat133 se parle à lui-même (Stephen135)...
 [:roxelay]


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 30-07-2009 à 16:37:39    

ce qui se passe à l'exécution de cygwin :
processWINDOWS -----création process---->processCYGWIN
 
processCYGWIN hérite de l'environnement du processWINDOWS puis processCYGWIN modifie son environnement !
 
comment lancer un programme par le processWINDOWS du processCYGWIN ?(ce qui me semble impossible)
ou, une alternative :
comment créer un nouveau processWINDOWS à partir de processCYGWIN ?
 
Merci d'avance


Message édité par BinItsMeKoi le 30-07-2009 à 16:43:25
Reply

Marsh Posté le 06-08-2009 à 10:25:57    

ouahouuu !
UN GRAND MERCI A
===>"Mac LAK" du forum www.developpez.net<====
Et à toutes les personnes qui ont pris de leur temps pour me trouver une réponse.
 
ça marche trop bien !
 
Le problème est résolu : runas /noprofile /user:USER "cmd"

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed