pourquoi ne ::CreateProcess(chemin d'accès,cmd,...) échoue avec l'erreur “Fichier non trouvé”?
Je suis en train d'avoir un programme en C++ déjà fait appel à un programme C# pour s'exécuter en arrière-plan.
STARTUPINFO info = {sizeof(info)};
PROCESS_INFORMATION processinfo;
DWORD error1 = GetLastError();
bool x = ::CreateProcess((LPCWSTR)"C:\Convert_Shrink.exe", GetCommandLine(), NULL, NULL, false, 0,NULL,NULL, &info, &processinfo);
DWORD error = GetLastError();
error1 est à 0 avant de CreateProcess
l'erreur est de 2 après CreateProcess
erreur 2:
ERROR_FILE_NOT_FOUND 2 (0x2) The system cannot find the file specified.
Je l'ai changé à C:\ \ au cas où ils étaient de contrôle pour les séquences d'échappement mais j'ai toujours l'erreur 2 et je ne sais pas pourquoi.
- Que le casting ne s'arrête que le compilateur de vous dire que vous avez fait mal. Il n'a pas vous arrêter de faire le mal. Mettre L en face de la chaîne pour en faire un caractère littéral.
- est-il possible que le chemin de l'application ne peut être si long, aswell? J'ai mis le programme en C:\ pour les tests, mais il doit être dans le même répertoire que le programme qui est plus profonde dans le répertoire.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez:
Utilisation
CreateProcessA
pour correspondre à votre ANSI chemin d'accès du fichier:* Fournir un chemin d'accès au fichier qui correspond à la chaîne de format requis par votre Unicode paramètres:
ou
Utilisation
CreateProcessW
de sorte que vous pouvez passer en Unicode filepath (prise en charge des caractères étendus):(comme @dolphy a noté, l'argument doit être une écriture de la chaîne)
Fournir un chemin d'accès au fichier qui correspond à la chaîne de format requis par votre Unicode paramètres:
ou
Utilisation
CreateProcessW
de sorte que vous pouvez passer en Unicode filepath (prise en charge des caractères étendus):(LPCWSTR)
avecL
et c'est du tout bon! 😉CreateProcessW
exige son argument pour être accessible en écriture. MSDN expressément interdit le passage d'une chaîne littérale.Juste pour le record. CreateProcessAsUser appels SearchPath en interne. SearchPath utilise le Système de Fichiers Redirecteur https://msdn.microsoft.com/en-us/library/windows/desktop/aa384187%28v=vs.85%29.aspx
Donc, si vous exécutez une version 32 bits de l'application sous WOW64 et vous demandez à un processus à l'aide d'un fichier exe dans system32 dir par exemple "c:\windows\system32\myapp.exe", CreateProcessAsUser va le chercher dans syswow64 au lieu par exemple"c:\windows\syswow64\myapp.exe". Si votre exe n'est pas là, vous aurez un "fichier introuvable".
J'ai juste regardé GetCommandLine(), et MSDN indique que c'est de la ligne de commande pour le processus en cours. MSDN entrée pour la fonction CreateProcess() indique que le deuxième argument est la ligne de commande que vous souhaitez exécuter, si je suis en train de lire correctement. Donc, vous êtes essentiellement en disant CreateProcess() pour exécuter un autre exemple de programme C++, pas le programme C#.
(edit)
En fait, en y regardant de près, la fonction CreateProcess() documentation ne semble pas expliquer clairement ce qui se passera si vous fournir à la fois les premier et second argument. Il est dit que la première indique le module et la deuxième indique la ligne de commande. Quelle est la diff?
Désolé pour le peu concluants réponse, je voudrais convertir cette réponse dans un couple de commentaires sur votre question, si je le pouvais.
Avez-vous essayé de coulée de la chaîne d'
LPCTSTR
à la place:À Partir De Microsoft:
(LPCTSTR)
. Parce que littérale sera le même. Bonne façon est d'utiliser _T() les macros.