Quelles sont les principales différences entre les deux? Je suis prêt à ne courir qu'un autre exe de mon application (C ++). Y a-t-il des différences lors de l'héritage des environnements, des caractéristiques de sécurité, etc. P>
3 Réponses :
La principale différence est en flexibilité. juste par exemple, avec Il convient probablement de noter que, bien que Shellexecute code> est plus facile à utiliser, mais n'a pas beaucoup de flexibilité.
CreateProcess Code> est une douleur à utiliser, mais vous permet de faire n'importe quoi. P>
CreateProcess code>, vous pouvez spécifier des poignées (tuyaux ou fichiers) à utiliser pour les flux d'entrée / sortie / d'erreur standard dans l'enfant.
Shellexecute code> ne vous donne pas envie de le faire. P>
Shellexecute CODE> peut être utilisé pour démarrer un exécutable directement, son intention principale consiste à "exécuter" des fichiers de document - par exemple, dire Il "exécuter" un "peu importe" un "peu importe", et il démarre votre navigateur Web par défaut et charge le fichier HTML spécifié. Vous pouvez faire cela en utilisant
CreateProcess code> aussi, mais pour le faire, vous (normalement) commencez par appeler
FindExecutable code> pour trouver le programme associé au fichier de données en question, puis exécuter qui transmettez votre fichier de données en tant que paramètre. P>
La principale différence entre Par exemple, à l'aide de Un autre exemple. Vous pouvez utiliser CreateProcess code> et
shelexecute code> est la suivante:
CreateProcess code> est plus orienté sur bas niveau et
shellexec code > Sur le levier utilisateur élevé qui voit l'utilisateur dans l'explorateur. P>
CreateProcess code> On peut utiliser la ligne de commande Quelle longueur est plus comme
max_path code>. Il a 32 768 caractères restriction. Vous pouvez également utiliser le programme
CreateProcess code> pour démarrer (si vous avez suffisamment d'autorisations) sur un autre bureau Windows, comme sur l'écran de connexion. P>
shellexecute code> pour démarrer le panneau de commande ou ouvrir tout programme existant sur l'ordinateur pour l'édition de JPG déposée par exemple. Donc, vous travaillez avec
shellexecute code> près des actions correspondantes dans l'Explorateur Windows. P>
CreateProcess ne peut pas démarrer un processus si le chemin du programme est supérieur à max_path. Il peut passer de longs arguments à un programme qui peut être démarré, mais c'est différent. Fondamentalement, il n'y a aucun moyen de démarrer un programme situé plus profond que max_path (sauf indication de 8,3 équivalents).
@nikos: On peut utiliser les deux lpapplicationName code> et
lpcommandline code> pour spécifier le programme avec des paramètres. La longueur maximale de
lpcommandline code> est limitée à 32 768 caractères. Vous pouvez lire dans La documentation < / a> que "Si LPApplicationName est NULL, la partie Nom du module de LPCOMMANDLine est limitée aux caractères max_path.". En utilisant les deux non null
lpapplicationName code> et
lpcommandline code> Il faut spécifier la partie du module quelle longueur est plus grande en tant que max_path. Je pense que l'on devrait utiliser le préfixe "\\? \" Dans le chemin
@nikos: De plus, à partir de Windows 10, version 1607, max_path limitations ont été supprimées des fonctions de fichier Win32 communes et de répertoires (voir l'annonce initiale et La documentation ).
@nikos: Dans de nombreux cas pratiques, on peut utiliser une solution de contournement plus simple pour commencer à réduire le chemin d'accès long à un autre plus court. On peut utiliser GesthortPathName A > Avec le chemin d'entrée qui commence par "\\" \ " code> et pour obtenir plus de noms courts, que vous pouvez utiliser à la place. Ce n'est pas la même chose, ce que j'ai écrit auparavant, mais il est utile de réduire plus de chemins de fichiers plus courts.
Essayez simplement de commencer un programme vraiment profond puis dites-moi si vous réussissez;) La théorie est loin de la pratique. Voyez ici pour plus zabkat.com/blog/long-8.3-path-names. htm
@nikos: Je ne comprends pas votre objectif ou votre question. Je ne peux pas faire des tests sur les anciens systèmes d'exploitation maintenant. J'ai changé le texte de l'ancienne réponse pour spécifier uniquement la longueur de lpcommandline code> pour réduire la discussion inutile. Si vous devez créer le processus avec le programme avec le chemin Long, je vous recommande d'utiliser
rtlcreateuserprocess code> avec
rtlcreateprocessparamètres code>. Vous aurez probablement besoin d'utiliser
ntresuméthread code>,
ntwaitforsingleObject code>,
rtldestroyProcessparamètres code>,
rtlinitunicodetring code> supplémentaire (et
rtldospathNameontPathName_u code> serait utile aussi).
@nikos: Vous seriez facile de créer la démo qui utilise l'API native basée sur Le code Exemple et Celui-ci a >. Si vous auriez des problèmes, vous pouvez poser une nouvelle question et je posterai l'exemple de code correspondant dans ma réponse.
J'ai essayé votre truc non documenté (échantillon runnt) mais toujours pas aller. J'ai essayé un simple exe avec une longueur de chemin de 307 caractères et il échoue dans l'appel à RTLcreateUserProcesser, quel que soit le système LongpathSenabled. En fait, votre échantillon ne peut même pas commencer un processus clair :)
@nikos: Tout d'abord, vous devriez changer votre tonne si vous voulez que quelqu'un vous aide. SECONDES Vous devriez poster Question séparée i> où vous décrivez vos problèmes et vos tentatives actuelles plus détaillées. L'ancienne réponse actuelle concerne les différences "CreateProcess and Shelexeces" et vous avez une autre question.
Je ne cherche pas à répondre. Vous avez fait une mauvaise assertion ci-dessus et je vous corrige. Vous ne pouvez pas démarrer un processus> max_path, période
CreateProcess code> renvoie la poignée et l'ID pour le processus démarré et c'est le fil principal dans le
Process_information Code> Structure P>
Le MSDN Docs vous donner ces informations. Cette question est entièrement trop vague et non spécifique pour. Il existe des dizaines de questions qui discutent des deux, et vous n'avez absolument aucun effort pour la recherche vous-même. (En tant que conseil: un seul vous permet de spécifier quoi que ce soit sur l'environnement, héritant des poignées et d'autres informations. Je laisserai à vos capacités de recherche de comprendre lequel.