CreateProcess pour exécuter de commande de Windows
Je suis en train d'exécuter une commande dos à l'aide de la fonction CreateProcess :
LPWSTR cmd=(LPWSTR)QString("C:\\windows\\system32\\cmd.exe subst " + DLetter+" \""+mountPath+"\"").utf16();
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
if ( CreateProcessW(0, //Application name
cmd, //Application arguments
NULL,
NULL,
TRUE,
0,
NULL,
L"C:\\windows\\system32", //Working directory
&si,
&pi) == TRUE)
{ ...
il donner comme la dernière erreur 3 = ERROR_PATH_NOT_FOUND, quand j'ai séparé le chemin de l'application "C:\\windows\\system32\\cmd.exe"
de la commande qu'il montre à la console sans l'exécution de ma commande subst.
Toute aide sera appréciée.
- Vous pourriez l'appeler
DefineDosDevice()
qui (non persistante) fait la même chose
Vous devez vous connecter pour publier un commentaire.
Vous devez inclure /C ou /K dans les options de
cmd.exe
.Sans l'une de ces options, le
subst
de commande que vous passez est tout simplement ignoré.Après avoir dit que,
subst
, au moins sur mon Windows 7 boite, n'est pas mis en œuvre à l'intérieur decmd.exe
. C'est un exécutable séparé. De sorte que vous pouvez les appeler directement et ignorercmd.exe
complètement.Concernant votre appel à
CreateProcess
j'ai les commentaires suivants:C:\\windows\\system32
. Il suffit d'invoquersubst.exe
et de laisser le système recherchez le fichier exécutable à l'aide du chemin de recherche standard.FALSE
pourbInheritHandles
. Vous n'êtes pas à l'adoption de poignées pour le nouveau processus et si vous n'avez pas besoin de le nouveau processus d'hériter de vos poignées.NULL
comme répertoire de travail. Il n'y a aucun besoin de le spécifier ici.subst
exécutable pour manipuler les mappages de lecteur. Utiliser les fonctions de l'API Win32 directement, commeDosDefineDevice()
,WNetAddConnection...()
,WNetCancelConnection...()
, etc.Essayez d'utiliser
à la place. CMD n'accepte pas les arguments sans
/c
ou/k
, et sauf si vous voulez voir le résultat dans la fenêtre de la console, il suffit d'utiliser/c
.