Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment récupérer le résultat d'une commande bat lancé par CreateProcess ?

4 réponses
Avatar
Benoit
Bonjour,

Voici une petite fonction qui permet d'installer une imprimante
automatiquement sur Windows 2000 et XP (voir MSDN Q189105).

BOOL CDrvInstallDlg::InstallMyPrinter2kXP()
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
DWORD dwResult;
BOOL bResult;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

if( !CreateProcess(
NULL, // name of executable module
(LPTSTR) "rundll32 printui.dll,PrintUIEntry /if /b "Mon
Imprimante" /f
Distrib\MonImprimante.inf /r "COM1:" /m "Mon
Imprimante" /Z", // command line string
NULL, // SD
NULL, // SD
FALSE, // handle inheritance option
0, // creation flags
NULL, // new environment block
NULL, // current directory name
&si, // startup information
&pi // process information
) )
{
AfxMessageBox( "Printer Setup failed. \n", MB_OK );
return FALSE;
}

// Wait until child process exits.
dwResult = WaitForSingleObject( pi.hProcess, INFINITE );
TRACE ("WaitForSingleObject retourne: %d .\n", dwResult);

// Close process and thread handles.
bResult = CloseHandle( pi.hProcess );
TRACE ("CloseHandle( pi.hProcess ) retourne: %d .\n", bResult);

bResult = CloseHandle( pi.hThread );
TRACE ("CloseHandle( pi.hThread ) retourne: %d .\n", bResult);

return TRUE;
}

Celle-ci fonctionne très bien mais ...
Le driver n'étant pas signé, Windows demande si l'on veut bien continuer ou
non.
Si l'utilisateur click sur oui, pas de problème, mais s'il click sur non je
me trouve dans l'incapacité de le savoir et mon prog continue malgré tout à
faire le reste de son installation.
Savez vous comment pourrais-je faire pour connaître le résultat de la
question, ou mieux, peut-on empêcher cette question d'être posé à part en le
faisant signé (j'en doute) ?

Benoit

4 réponses

Avatar
François Müller
Bonjour,

"Benoit" escribió en el mensaje
news:biil97$oks$
Savez vous comment pourrais-je faire pour connaître le résultat de la
question, ou mieux, peut-on empêcher cette question d'être posé à part en


le
faisant signé (j'en doute) ?



GetExitCodeProcess

F.
Avatar
Benoit
> Bonjour,

"Benoit" escribió en el mensaje
news:biil97$oks$
> Savez vous comment pourrais-je faire pour connaître le résultat de la
> question, ou mieux, peut-on empêcher cette question d'être posé à part


en
le
> faisant signé (j'en doute) ?

GetExitCodeProcess

F.



Ca c'est une réponse rapide...

J'essai tout de suite.

Benoit
Avatar
François Müller
"Benoit" escribió en el mensaje
news:bikte6$etc$
| J'ai ajouté GetExitCodeProcess dans mon code (voir ci-dessous), mais que
je
| réponde oui ou non à la question posé par windows, j'obtien toujours le
même
| résultat.
| Ce peut-il que certaine dll ne répondent rien ?

Visiblement, le rundll32 ne retourne rien

| Ou y a-t-il quelque chose qui ne vas pas dans mon code ?

GetExitCodeThread n'était pas nécessaire dans la mesure ou l'attente
d'affectue sur l'objet process pas sur l'objet thread

A tout hasard, jette un coup d'oeil la dessus dans le MSDN (j'ai pas regardé
en détail, mais peut être cela répond à ta question)

ms-help://MS.MSDNQTR.2002APR.1033/kbwinnt/Source/ntrelease/q189105.htm

François
Avatar
Benoit
> > Savez vous comment pourrais-je faire pour connaître le résultat de la
> question, ou mieux, peut-on empêcher cette question d'être posé à part


en
le faisant signé (j'en doute) ?

GetExitCodeProcess

F.



J'ai ajouté GetExitCodeProcess dans mon code (voir ci-dessous), mais que je
réponde oui ou non à la question posé par windows, j'obtien toujours le même
résultat.
Ce peut-il que certaine dll ne répondent rien ?
Ou y a-t-il quelque chose qui ne vas pas dans mon code ?

Merci de votre aide
Benoit


BOOL CDrvInstallDlg::InstallMyPrinter2kXP()
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
DWORD dwResult;
DWORD dwExitCode;
BOOL bResult;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

if( !CreateProcess(
NULL, // name of executable module
(LPTSTR) "rundll32 printui.dll,PrintUIEntry /if /b
"MonImprimante" /f
DistribMonImprimante.inf /r "COM1:" /m
"MonImprimante" /Z /q", // command line string
NULL, // SD
NULL, // SD
FALSE, // handle inheritance option
0, // creation flags
NULL, // new environment block
NULL, // current directory name
&si, // startup information
&pi // process information
) )
{
AfxMessageBox( "Printer Setup failed. n", MB_OK );
return FALSE;
}

// Wait until child process exits.
dwResult = WaitForSingleObject( pi.hProcess, INFINITE );
TRACE ("WaitForSingleObject retourne: %d .n", dwResult);

//-- code rajouté --
bResult = GetExitCodeThread( pi.hThread , &dwExitCode );
TRACE ("GetExitCodeThread retourne: %d .n", bResult);
TRACE ("dwExitCode = %d .n", dwExitCode);
//-- fin du code rajouté --

// Close process and thread handles.
bResult = CloseHandle( pi.hProcess );
TRACE ("CloseHandle( pi.hProcess ) retourne: %d .n", bResult);

bResult = CloseHandle( pi.hThread );
TRACE ("CloseHandle( pi.hThread ) retourne: %d .n", bResult);

return TRUE;
}