Twan Achats/Ventes : cedm238 et 7 utilisateurs inconnus

 Mot :   Pseudo :  
 
 Page :  1  2  3
Page Précédente 
Auteur
 Sujet :

Lancer une commande dos en C

 
n°48709
Twan
Posté le 15-09-2006 à 14:25:34  profilanswer
 

Voila tout est dans le titre, comment on peut lancer une commande dos a partir d'un programme en C ???

n°48713
LostSoul
Manieur de hache
Posté le 15-09-2006 à 15:12:30  profilanswer
 

execlp() ou qqch du genre ...

n°48714
Gwalchmei
Aussi en versions 1/2 & 1/3
Posté le 15-09-2006 à 15:15:40  profilanswer
 

http://c.developpez.com/  :whistle:


---------------
La sagesse commence où finit la crainte de Dieu. (André Gide)
AKA : Super Laïque
Computermsa-Shop Magasin belge de qualité !
n°48715
Ashe
reenignE esreveR
Posté le 15-09-2006 à 17:08:52  profilanswer
 

Version nulle:

Version UNIX (faut le runtime VC++):

Version bien:

Version pipes:

Version pipes UNIX (faut le runtime de VC++):

Message cité 2 fois
Message édité par Ashe le 15-09-2006 à 17:11:56

---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°48716
virus2013
@}oo{=======>
Posté le 15-09-2006 à 17:26:27  profilanswer
 

C'est quoi ton métier Ashe ? :) Tu m'impressionnes ! La seule chose que j'ai réussi à programmer jusqu'à maintenant, c'est un calendrier avec horloge numérique en Visual Basic .Net... loll
Je précise quand même que je n'ai aucune formation là dedans hein ! :D


---------------
L'informatique, c'est comme les femmes. On adore, mais on ne comprend jamais vraiment !
n°48717
Ashe
reenignE esreveR
Posté le 15-09-2006 à 17:33:28  profilanswer
 

Moi non plus :p


---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°48718
virus2013
@}oo{=======>
Posté le 15-09-2006 à 17:47:20  profilanswer
 

Métier / Occupations :    Ingénieur (3D temps réel) :p
Moi, j'ai vraiment AUCUNE qualifications ! Uniquement autodidacte. Mais bon, avec 2 enfants et un boulot, plus trop de temps pour lire les briques de 300 pages qui trainent sur mon bureau...


---------------
L'informatique, c'est comme les femmes. On adore, mais on ne comprend jamais vraiment !
n°48719
sebx
boulet cherche canon
Posté le 15-09-2006 à 17:48:46  profilanswer
 

Twan a écrit :

Voila tout est dans le titre, comment on peut lancer une commande dos a partir d'un programme en C ???


 

Ashe a écrit :

Version UNIX (faut le runtime VC++):


 
balèse   :D


---------------
Célibataire & béhémiste de service
Gentil Organisateur des rencontres matbe
JH 27 ans, bon salaire, propriétaire, roulant en berline Allemande cherche femme pour mariage, bébés et + si affinités
n°48720
Ashe
reenignE esreveR
Posté le 15-09-2006 à 17:51:48  profilanswer
 

virus2013 a écrit :

Moi, j'ai vraiment AUCUNE qualifications ! Uniquement autodidacte.


Ben wai, pareil :spamafote:

sebx a écrit :

balèse   :D


 :??:


---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°48721
virus2013
@}oo{=======>
Posté le 15-09-2006 à 17:56:22  profilanswer
 

Lol je vois que t'habites à Liège ? Tu donnes pas des cours ? Je suis à 30 Km seulement... ;)


---------------
L'informatique, c'est comme les femmes. On adore, mais on ne comprend jamais vraiment !
n°48722
Ashe
reenignE esreveR
Posté le 15-09-2006 à 18:00:44  profilanswer
 

Ca peut s'arranger, mais jdemenage a Namur d'ici qq semaines (si j'arrive a rester en Belgique + de qq jours :D)


---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°48726
LostSoul
Manieur de hache
Posté le 15-09-2006 à 18:17:26  profilanswer
 

sebx a écrit :

balèse   :D


 


 
commande dos, fonction unix style :D
 
mais bon c'est comme ca ...

n°48727
Ashe
reenignE esreveR
Posté le 15-09-2006 à 18:27:43  profilanswer
 

Bah spas ma faute si VC++ a des fonctions POSIX et BSD hein :p


---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°48728
LostSoul
Manieur de hache
Posté le 15-09-2006 à 18:29:29  profilanswer
 

ben y'a pas que lui de toute façon, mais c'est vrai que ce sont de vieux standards. Ca y est toujours pour des raisons de compatibilité.
Par contre ShellExecute() ca c'est pur propriétaire winwin

n°48729
Ashe
reenignE esreveR
Posté le 15-09-2006 à 18:32:20  profilanswer
 

:heink:


---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°48730
LostSoul
Manieur de hache
Posté le 15-09-2006 à 18:33:18  profilanswer
 

au moins les execxxx si on recompile le code ailleurs ca passera quoi

n°48731
Ashe
reenignE esreveR
Posté le 15-09-2006 à 18:37:01  profilanswer
 

Ben euh non, la plupart des compilateurs sous Windows l'ont pas dans leur CRT... D'ailleurs sous VC++ faut rajouter un _ devant suivant la version
exec*/popen == POSIX
ShellExecute(Ex)/CreateProcess/CreatePipe == Win32
:spamafote:


---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°48732
LostSoul
Manieur de hache
Posté le 15-09-2006 à 18:43:00  profilanswer
 

bah borland c++ et watcom c++ sous DOS avaient déjà ces trucs là il me semble, GCC l'a certainement aussi VC++ aussi paske je me souviens avoir utilisé execlp() (réminiscences d'il y a 6 ans)
 
Sinon sur Lattice C 5 / Atari y'a spawn() et fork() :p (et aussi toutes les execxxx())


Message édité par LostSoul le 15-09-2006 à 18:46:12
n°48733
Ashe
reenignE esreveR
Posté le 15-09-2006 à 18:48:16  profilanswer
 

Et DOS c'est pas Windows :p
Codewarrior l'a pas, Borland l'a pas, et gcc l'a pas vu que c'est un system call
cygwin doit l'avoir, mais c'est pas vraiment windows :p
Et tu t'souviens ptet avoir utilise execlp() y a 6 ans dans VC++, sauf que c'est _execlp(), d'ailleurs:

Citation :

This POSIX function is deprecated beginning in Visual C++ 2005. Use the ISO C++ conformant _execlp instead.


---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°48734
LostSoul
Manieur de hache
Posté le 15-09-2006 à 18:50:05  profilanswer
 

c'est possible, mais c'tait pas visual C++ 2005 à l'époque, c'tait Visual C++ 6 aussi ...

n°48735
Ashe
reenignE esreveR
Posté le 15-09-2006 à 18:51:37  profilanswer
 

Le 6 c'est avec un _ aussi


---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°48736
LostSoul
Manieur de hache
Posté le 15-09-2006 à 18:52:42  profilanswer
 

En tout cas avec tout ça il a tous les choix possibles pour le faire.

n°48804
Harkonnen
Posté le 18-09-2006 à 07:32:30  profilanswer
 


Je vois pas en quoi ces fonctions sont nulles :heink:
Au contraire, elles sont parfaitement adaptées à ce que demande Twan. system() est tout à fait standard et portable, quant aux 2 autres, elles sont tout à fait valables aussi sauf qu'elles ne fonctionnent que sous Win32.
Quant à conseiller CreateProcess(), c'est un coup de canon pour tuer une mouche.


Message édité par Harkonnen le 18-09-2006 à 07:34:14
n°48808
Ashe
reenignE esreveR
Posté le 18-09-2006 à 12:13:33  profilanswer
 

system() => ouvre une console si le programme n'a pas cree un console (bref, c'est moche, surtout que l'utilisateur se fout royalement de savoir que son programme a besoin de lancer une console)
ShellExecute() => aucun controle sur le process
ShellExecuteEx() => wrapper autour de CreateProcess qui est surtout utile pour ouvrir un document sans avoir besoin de connaitre le programme qui lui est associe
CreateProcess() => "create process" => "creer process" </hint>


---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°48810
Ashe
reenignE esreveR
Posté le 18-09-2006 à 12:15:53  profilanswer
 

Au passage, en utilisant ShellExecuteEx (qui permet au moins de savoir quand le process se termine), ca donne:

Code :
  1. typedef struct _SHELLEXECUTEINFO {
  2.     DWORD cbSize;
  3.     ULONG fMask;
  4.     HWND hwnd;
  5.     LPCTSTR lpVerb;
  6.     LPCTSTR lpFile;
  7.     LPCTSTR lpParameters;
  8.     LPCTSTR lpDirectory;
  9.     int nShow;
  10.     HINSTANCE hInstApp;
  11.     LPVOID lpIDList;
  12.     LPCTSTR lpClass;
  13.     HKEY hkeyClass;
  14.     DWORD dwHotKey;
  15.     union {
  16.         HANDLE hIcon;
  17.         HANDLE hMonitor;
  18.     } DUMMYUNIONNAME;
  19.     HANDLE hProcess;
  20. } SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;


 
CreateProcess:
 

Code :
  1. BOOL WINAPI CreateProcess(
  2.   LPCTSTR lpApplicationName,
  3.   LPTSTR lpCommandLine,
  4.   LPSECURITY_ATTRIBUTES lpProcessAttributes,
  5.   LPSECURITY_ATTRIBUTES lpThreadAttributes,
  6.   BOOL bInheritHandles,
  7.   DWORD dwCreationFlags,
  8.   LPVOID lpEnvironment,
  9.   LPCTSTR lpCurrentDirectory,
  10.   LPSTARTUPINFO lpStartupInfo,
  11.   LPPROCESS_INFORMATION lpProcessInformation
  12. );


Avec 3/4 des arguments qui sont NULL, jvois pas en quoi c'est un coup de canon pour tuer une mouche :spamafote:


---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°48816
Harkonnen
Posté le 18-09-2006 à 13:29:40  profilanswer
 

Ashe a écrit :

system() => ouvre une console si le programme n'a pas cree un console (bref, c'est moche, surtout que l'utilisateur se fout royalement de savoir que son programme a besoin de lancer une console)
Cette fonction est peut etre moche, mais elle est portable. Evidemment, si le source est destiné à une utilisation sous Windows, cet argument disparait
ShellExecute() => aucun controle sur le process
ShellExecuteEx() => wrapper autour de CreateProcess qui est surtout utile pour ouvrir un document sans avoir besoin de connaitre le programme qui lui est associe
Justement, c'est un des avantages de ShellExecute.
CreateProcess() => "create process" => "creer process" </hint>
Oui merci, je connais la fonction CreateProcess(). Par contre, ce qui t'a échappé, c'est que CreateProcess() fait fi de la sécurité. En d'autres termes : si un utilisateur n'a pas le droit de lancer un programme sur sa machine à cause d'une restriction imposée par son admin par exemple, CreateProcess() s'en tape et passe outre, ce qui n'est pas le cas de ShellExecute qui applique les restrictions de sécurité liées aux exécutables. Rien que pour ça, CreateProcess() est à proscrire.


 

Ashe a écrit :

Au passage, en utilisant ShellExecuteEx (qui permet au moins de savoir quand le process se termine), ca donne:

Code :
  1. typedef struct _SHELLEXECUTEINFO {
  2.     DWORD cbSize;
  3.     ULONG fMask;
  4.     HWND hwnd;
  5.     LPCTSTR lpVerb;
  6.     LPCTSTR lpFile;
  7.     LPCTSTR lpParameters;
  8.     LPCTSTR lpDirectory;
  9.     int nShow;
  10.     HINSTANCE hInstApp;
  11.     LPVOID lpIDList;
  12.     LPCTSTR lpClass;
  13.     HKEY hkeyClass;
  14.     DWORD dwHotKey;
  15.     union {
  16.         HANDLE hIcon;
  17.         HANDLE hMonitor;
  18.     } DUMMYUNIONNAME;
  19.     HANDLE hProcess;
  20. } SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;


 
CreateProcess:
 

Code :
  1. BOOL WINAPI CreateProcess(
  2.   LPCTSTR lpApplicationName,
  3.   LPTSTR lpCommandLine,
  4.   LPSECURITY_ATTRIBUTES lpProcessAttributes,
  5.   LPSECURITY_ATTRIBUTES lpThreadAttributes,
  6.   BOOL bInheritHandles,
  7.   DWORD dwCreationFlags,
  8.   LPVOID lpEnvironment,
  9.   LPCTSTR lpCurrentDirectory,
  10.   LPSTARTUPINFO lpStartupInfo,
  11.   LPPROCESS_INFORMATION lpProcessInformation
  12. );


Avec 3/4 des arguments qui sont NULL, jvois pas en quoi c'est un coup de canon pour tuer une mouche :spamafote:


Quand je disais que CreateProcess était un coup de canon, je ne le jugeais pas sur le nombre de ses arguments qui ne représente en rien un critère de complexité, mais uniquement sur le fait que vu ce qui est demandé ici, je trouve totalement inutile et consommateur de mémoire de lancer un processus fils pour une simple commande DOS.
 
Quant au nombre des arguments de CreateProcess par rapport à ShellExecute, il faut juger leur type et pas leur nombre... As tu vu qu'une grande partie des arguments de CreateProcess() est constituée de structures à remplir, là où ShellExecute() ne réclame quasiment que des pointeurs ? Personnellement, je trouve qu'il est bien plus rapide de spécifier des pointeurs plutot que de remplir des structures. Evidemment, on peut mettre NULL là ou on veut, mais alors on s'asseoit sur la sécurité, l'apparence de la fenêtre, et toutes ces choses que ShellExecute fait automatiquement.
 
Et comme tu le dis, ShellExecute() notifie de la fin du programme.

n°48832
Ashe
reenignE esreveR
Posté le 18-09-2006 à 17:18:38  profilanswer
 

Et au passage CreateProcess laisse pas lancer un truc pour lequel on a pas les droits :p
Et ShellExecute notifie rien, c'est ShellExecuteEx :p
CreateProcess, 3/4 des arguments sont NULL dans 99% des utilisations :p
Et la securite c'est pas en changeant les parametres de l'appel de la fonction qu'on la modifie, les parametres ils modifient la securite du process lance, mais faut avoir les droits pour le lancer avant :p
Et juste pour terminer dans le ridicule:
 

Citation :

inutile et consommateur de lancer un processus fils pour une simple commande DOS


 
Elle est bien bonne:

\crt\src\popen.c(258):            childstatus = CreateProcess( (LPTSTR) cmdexe,
\crt\src\dospawn.c(175):        CreateProcessStatus = CreateProcess( (LPTSTR)name,


1) c'est par ces lignes que passent system() et exec*()
2) ShellExecute arrive a CreateProcess aussi, sauf qu'il passe par le shell, histoire de perdre un peu de temps
3) DTC

Message cité 1 fois
Message édité par Ashe le 18-09-2006 à 17:19:13

---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°48833
LostSoul
Manieur de hache
Posté le 18-09-2006 à 19:01:04  profilanswer
 

Tu peux expliciter le point 3 ? :D

n°48834
Ashe
reenignE esreveR
Posté le 18-09-2006 à 19:04:30  profilanswer
 

Euh Data Transfer Controller?
Euh Diagnostic Trouble Code?
Euh Dans Ton Code?


---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°48841
Harkonnen
Posté le 19-09-2006 à 00:16:18  profilanswer
 

Ashe a écrit :

Et au passage CreateProcess laisse pas lancer un truc pour lequel on a pas les droits :p


Ah bon ? Dans ce cas tu vas pouvoir me justifier l'existence :
- du paramètre lpProcessAttributes
- de la fonction CreateProcessAsUser
- de la fonction CreateProcessWithLogonW
 
A quoi servent-elles donc, puisque que CreateProcess selon toi, récupère le contexte de sécurité de l'utilisateur ? Je dis, et je maintiens, pour l'avoir testé et utilisé professionnellement, que CreateProcess() ne maintient pas les profils de sécurité définis. Et après recherche, de nombreux forums me donnent raison.
Un exemple ? Fais une recherche sur ce topic du forum de Winamp :
http://forums.winamp.com/showthread.php?postid=796635
 
d'autres liens :
http://groups.google.fr/group/borl [...] 2f85375b10
http://groups.google.fr/group/comp [...] a3b48d2a73
 
Ou l'on apprend que même Microsoft recommande l'utilisation de ShellExecuteEx comme seul moyen de lancer un exécutable.
 

Ashe a écrit :


Et ShellExecute notifie rien, c'est ShellExecuteEx :p


Bien évidemment... De toute façon il faut utiliser les fonctions *****Ex() quand elles sont présentes.
 

Ashe a écrit :


CreateProcess, 3/4 des arguments sont NULL dans 99% des utilisations :p


Peut être pour toi...  

Ashe a écrit :


Et la securite c'est pas en changeant les parametres de l'appel de la fonction qu'on la modifie, les parametres ils modifient la securite du process lance, mais faut avoir les droits pour le lancer avant :p


Cf mon 1er quote ci dessus.
 

Ashe a écrit :


Et juste pour terminer dans le ridicule:
 

Citation :

inutile et consommateur de lancer un processus fils pour une simple commande DOS


Elle est bien bonne:

\crt\src\popen.c(258):            childstatus = CreateProcess( (LPTSTR) cmdexe,
\crt\src\dospawn.c(175):        CreateProcessStatus = CreateProcess( (LPTSTR)name,


 
1) c'est par ces lignes que passent system() et exec*()
2) ShellExecute arrive a CreateProcess aussi, sauf qu'il passe par le shell, histoire de perdre un peu de temps
3) DTC


 
1) Merci de donner le code complet stp, et pas les morceaux qui t'arrangent :
popen.c

Code :
  1. /*
  2.          * Initialise the variable for passing to CreateProcess
  3.          */
  4.         memset(&StartupInfo, 0, sizeof(StartupInfo));
  5.         StartupInfo.cb = sizeof(StartupInfo);
  6.         /* Used by os for duplicating the Handles. */
  7.         StartupInfo.dwFlags = STARTF_USESTDHANDLES;
  8.         StartupInfo.hStdInput = stdhdl == STDIN ? (HANDLE) newhnd
  9.                                                 : (HANDLE) _osfhnd(0);
  10.         StartupInfo.hStdOutput = stdhdl == STDOUT ? (HANDLE) newhnd
  11.                                                   : (HANDLE) _osfhnd(1);
  12.         StartupInfo.hStdError = (HANDLE) _osfhnd(2);
  13.         CommandLineSize = _tcslen(cmdexe) + _tcslen(_T(" /c " )) + (_tcslen(cmdstring)) +1;
  14.         if ((CommandLine = _calloc_crt( CommandLineSize, sizeof(_TSCHAR))) == NULL)
  15.             goto error3;
  16.         _ERRCHECK(_tcscpy_s(CommandLine, CommandLineSize, cmdexe));
  17.         _ERRCHECK(_tcscat_s(CommandLine, CommandLineSize, _T(" /c " )));
  18.         _ERRCHECK(_tcscat_s(CommandLine, CommandLineSize, cmdstring));
  19.         /* Check if cmdexe can be accessed. If yes CreateProcess else try
  20.          * searching path.
  21.          */
  22.         save_errno = errno;
  23.         if (_taccess_s(cmdexe, 0) == 0) {
  24.             childstatus = CreateProcess( (LPTSTR) cmdexe,
  25.                                          (LPTSTR) CommandLine,
  26.                                          NULL,
  27.                                          NULL,
  28.                                          TRUE,
  29.                                          0,
  30.                                          NULL,
  31.                                          NULL,
  32.                                          &StartupInfo,
  33.                                          &ProcessInfo
  34.                                          );
  35.         }


On voit déjà que StartupInfo et ProcessInfo ne sont pas à NULL. Le code montre déjà le "remplissage" de StartupInfo et l'on peut constater que les champs de cette structure sont loin d'être triviaux pour un débutant.
 
dospawn.c

Code :
  1. memset(&StartupInfo,0,sizeof(StartupInfo));
  2.         StartupInfo.cb = sizeof(StartupInfo);
  3.         for ( nh = _nhandle ;
  4.               nh && !_osfile(nh - 1) ;
  5.               nh-- ) ;
  6.         if (nh < 0 ||
  7.             nh >= ((USHRT_MAX - sizeof(int)) / (sizeof(char) + sizeof(intptr_t))))
  8.         {
  9.             errno = ENOMEM;
  10.             return -1;
  11.         }
  12.         StartupInfo.cbReserved2 =
  13.             (unsigned short)(sizeof(int) + (nh * (sizeof(char) + sizeof(intptr_t))));
  14.         StartupInfo.lpReserved2 = _calloc_crt( StartupInfo.cbReserved2, 1 );
  15.         if (!StartupInfo.lpReserved2)
  16.         {
  17.             errno = ENOMEM;
  18.             return -1;
  19.         }
  20.         *((UNALIGNED int *)(StartupInfo.lpReserved2)) = nh;
  21.         posfile = (char *)(StartupInfo.lpReserved2 + sizeof(int));
  22.         posfhnd = (UNALIGNED intptr_t *)(StartupInfo.lpReserved2 +
  23.             sizeof(int) + (nh * sizeof(char)));
  24.         for ( i = 0;
  25. #pragma warning(suppress: 22009) /* Here prefast is very confused by this nh */
  26.               i < nh ;
  27.               i++, posfile++, posfhnd++ )
  28.         {
  29.             pio = _pioinfo(i);
  30.             if ( (pio->osfile & FNOINHERIT) == 0 ) {
  31.                 *posfile = pio->osfile;
  32.                 *posfhnd = pio->osfhnd;
  33.             }
  34.             else {
  35.                 *posfile = 0;
  36.                 *posfhnd = (intptr_t)INVALID_HANDLE_VALUE;
  37.             }
  38.         }
  39.         /*
  40.          * if the child process is detached, it cannot access the console, so
  41.          * we must nuke the information passed for the first three handles.
  42.          */
  43.         if ( background ) {
  44.             for ( i = 0,
  45.                   posfile = (char *)(StartupInfo.lpReserved2 + sizeof( int )),
  46.                   posfhnd = (UNALIGNED intptr_t *)(StartupInfo.lpReserved2 + sizeof( int )
  47.                             + (nh * sizeof( char ))) ;
  48.                   i < __min( nh, 3 ) ;
  49.                   i++, posfile++, posfhnd++ )
  50.             {
  51.                 *posfile = 0;
  52.                 *posfhnd = (intptr_t)INVALID_HANDLE_VALUE;
  53.             }
  54.             fdwCreate |= DETACHED_PROCESS;
  55.         }
  56.         /*
  57.          * errno is set to something non-zero if there are some
  58.          * errors in the spawning
  59.          */
  60.         _doserrno = 0;
  61. #ifdef WPRFLAG
  62.         /* indicate to CreateProcess that environment block is wide */
  63.         fdwCreate |= CREATE_UNICODE_ENVIRONMENT;
  64. #endif  /* WPRFLAG */
  65.         CreateProcessStatus = CreateProcess( (LPTSTR)name,
  66.                                              CommandLine,
  67.                                              NULL,
  68.                                              NULL,
  69.                                              TRUE,
  70.                                              fdwCreate,
  71.                                              envblk,
  72.                                              NULL,
  73.                                              &StartupInfo,
  74.                                              &ProcessInformation
  75.                                            );


Pour une fonction dont 3/4 des arguments sont sensés être NULL, je trouve qu'elle est quand même bien fournie...
Je tiens à ta disposition le désassemblage de la fonction ShellExecute() si tu le souhaites. C'est de l'assembleur, mais je suppose que ton niveau devrait te permettre de l'appréhender sans problème. Je te rassure, c'est la même punition au niveau des paramètres.
 
Bref, tout ceci pour démontrer que :

  • CreateProcess(), quand elle est correctement utilisée, est une vraie usine à gaz à paramétrer, et du fait des nombreux controles de validité effectués pour les différents champs des structures passées en paramètres, est un poil plus lente que ShellExecuteEx() (testé au profiler)
  • Il ne suffit pas d'appeler CreateProcess() avec des NULL partout pour lancer un exécutable, sauf si on a envie de se tirer une balle dans le pied.


Quant à ton point 3), je préfère éviter de répondre, en t'invitant néanmoins à faire preuve d'un peu plus d'humilité envers quelqu'un que tu ne connais pas, qui ne t'a pas insulté et qui possède certainement plus d'expérience que toi en programmation Win32.


Message édité par Harkonnen le 19-09-2006 à 00:16:32
n°48844
LostSoul
Manieur de hache
Posté le 19-09-2006 à 06:51:44  profilanswer
 

De toute façon t'es hors scope  [:spamafote]

n°48846
Ashe
reenignE esreveR
Posté le 19-09-2006 à 08:27:14  profilanswer
 

Mon but n'etait pas de montrer que 3/4 des arguments etaient NULL mais bien de montrer que system() utilise CreateProcess et donc que

Citation :

totalement inutile et consommateur de mémoire de lancer un processus fils pour une simple commande DOS


C'est du grand n'importe quoi :D
 
Sinon tes exemples de forums euh, faudra que tu lises tous les posts parce qu'ils vont pas vraiment dans ton sens :D
 
Et t'auras beau repeter que t'es un "professionel" (si c'est pas une assurance de tes connaissances ca :D):

Citation :

Windows XP/2000/NT:  The ACLs in the default security descriptor for a process come from the primary or impersonation token of the creator. This behavior changed with Windows XP SP2 and Windows Server 2003.


Et pour faire une impersonation, faut taper le mot de passe
 
En resume: DTC v2 :sol:


---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°48847
Ashe
reenignE esreveR
Posté le 19-09-2006 à 08:44:36  profilanswer
 

Remarque etant un professionel tu vas pouvoir facilement nous prouver ce que tu dis, suffit que t'ecrives:
 
1) un programme qui lance un .exe avec ShellExecuteEx et attend qu'il se termine
2) pareil mais avec CreateProcess
3) pareil mais avec CreateProcess et en permettant de lancer un programme en tant qu'admin quand tu lances ton code avec un utilisateur guest
 
:jap:


---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°48848
Gwalchmei
Aussi en versions 1/2 & 1/3
Posté le 19-09-2006 à 09:49:09  profilanswer
 

Bon, et à part ça, Twan, tu as ce que tu voulais ?  :whistle:


---------------
La sagesse commence où finit la crainte de Dieu. (André Gide)
AKA : Super Laïque
Computermsa-Shop Magasin belge de qualité !
n°48849
LostSoul
Manieur de hache
Posté le 19-09-2006 à 09:56:20  profilanswer
 

Gwalchmei a écrit :

Bon, et à part ça, Twan, tu as ce que tu voulais ?  :whistle:


 
ben je lui avais donné la réponse dès le début :D

n°48850
Twan
Posté le 19-09-2006 à 10:05:16  profilanswer
 

Vi c'est bon, j'ai reussi a faire ce que je voulais, merci bien !

n°48851
Ashe
reenignE esreveR
Posté le 19-09-2006 à 10:06:17  profilanswer
 

(et le pire c'est qu'il a probablement utilise system() :D)


---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°48852
Twan
Posté le 19-09-2006 à 10:11:27  profilanswer
 

nan j'ai rien utilisé de tout ca, ca marchait pas, c'etait un programme en C pour un Scanpal, je sais pas si vous connaissez. En fait je voulais que ca lance une application de windows quand je le reliais au PC et que j'appelais cette fonction, mais bon ... Je suis con, c'etait impossible que ca marche !

n°48853
Ashe
reenignE esreveR
Posté le 19-09-2006 à 10:17:00  profilanswer
 

Ben ca depend avec quoi tu le relies au PC... mais bon si c'est du port serie c'est sur que ca fonctionnera pas tout seul ('fin tu peux creer un service qui check le port serie toutes les 15 secondes mais c'est un peu chiant :D)
Par contre en USB ca reste largement faisable :p


Message édité par Ashe le 19-09-2006 à 10:17:15

---------------
Globe trotter/SDF - Namur, Belgique
Joy, beautiful spark of the gods, Daughter of Elysium, We enter fire imbibed, Heavenly, thy sanctuary.
Trombi Matbe
n°48854
Twan
Posté le 19-09-2006 à 10:27:04  profilanswer
 

C'est un port serie !

 Page :  1  2  3
Page Précédente 

Aller à :
Ajouter une réponse