Shellexec vs Exec vs Shellexec mon fichier de commandes
Je ne trouve pas dans l'aide d'une explication exhaustive de la différence entre Shellexec et Exec. Est le
Shellexec('','program.exe',params,'',SW_HIDE,ewWaitUntilTerminated,ResultCode)
équivalent à
Exec('program.exe',params,'',SW_HIDE,ewWaitUntilTerminated,ResultCode)
lorsque vous travaillez avec des fichiers exe? Bien sûr, quand je veux exécuter un fichier différent de exe ou lot de fabrication, à l'utilisation Shellexec.
Parfois, cependant, je ne peux pas obtenir mon istruction pour fonctionner correctement ni par Shellexec ni Exec. La seule solution qui a toujours le travail consiste à écrire un fichier de commandes et de l'exécuter via shellexec. Personnellement je n'aime pas cette solution car je suis confronté à un fichier temporaire et je n'ai pas confiance en la resultcode obtenus.
Maintenant, je vais devoir revenir pour le fichier de commandes de la solution, car je ne sais pas comment obtenir ce travail d'instruction: (l'erreur est qu'il soulève l'instruction échoue si le fichier de destination n'est pas déjà présent, alors que dans l'invite de commande de l'instruction fonctionne même le fichier de destination n'existe pas).
mysqldump := 'C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin\mysqldump.exe';
params := '-uroot -ppassword myschema>C:\myappdir\backup\newbackup.sql';
//the destination folder exists, the file newbackup.sql does not exist
Shellexec('',mysqldump,params,'',SW_HIDE,ewWaitUntilTerminated,ResultCode);
Je travaille sur Windows 7 64 bits, le programme (une Inno Setup installer) est exécutée avec les droits d'administration
{pf32}
constante au lieu de C:\Program Files (x86)
. Il vous renvoie le chemin d'accès correct pour le 32 bits répertoire program files. Je pense que ça pourrait être la cause de votre problème, mais difficile à dire. Vous pouvez aussi vérifier si le fichier existe avec le FileExists
fonction avant d'essayer de l'exécuter.OriginalL'auteur lib | 2012-04-29
Vous devez vous connecter pour publier un commentaire.
Dans cette situation dans Inno Setup, les deux appels sont à peu près identiques. Toutefois, si le programme d'installation est en cours d'exécution au plus bas de ses privilèges et de vous essayer d'exécuter un processus qui nécessite l'élévation,
ShellExec()
permettra à l'invite alors queExec()
échouera.Les différences entre les deux apparaissent lors du passage simple et monolithique des lignes de commande, en passant non exécutables, ou lors de l'utilisation de verbes autres que
"open"
.Noter que ni la fonction va vous permettre d'exécuter des commandes ou des opérations prévues par l'interpréteur de commande comme l'opérateur de redirection (
... > ...
).Ces commandes devront être passées à
{cmd}
pour être en mesure d'exécuter.Voici quelques-air code:
ShellExec
etExec
utilise les mêmes droits que le programme d'installation lui-même.Ah, j'ai raté l'inno-setup balise, dans ce cas, oui, ils sont à peu près identiques, et viennent doen à l'analyse. SI howwver, le programme d'installation est exécuté en tant qu'utilisateur limité, ou
ShellExecAsOriginalUser
puis il va demander de l'altitude, si nécessaire.Exec()
échouera dans ce cas.La réponse a été réécrit avec Inno à l'esprit.
Merci!!!! Maintenant, je comprends pourquoi il ne fonctionne pas! Désolé pour le Delphi tag en première position, c'était peut-être trompeuse
OriginalL'auteur Deanna
Avez-vous envisagé d'utiliser CreateProcess pour démarrer le processus? Cet appel d'offre quelques options supplémentaires pour contrôler le processus qui en résulte, et peut également gérer les paramètres transmis mieux.
Merci, je n'ai pas essayé d'instruction avant. Je n'ai pas encore trouvé un CreateProcess instruction dans Innosetup. De toute façon, je pense qu'il peut être utile dans mon Delphi projets. Dans le processus d'apprentissage de l'utilisation de la fonction CreateProcess je suis tombé sur question. Mon instruction ne fonctionne toujours pas, peut-être à cause de la redirection de la sortie.
Vous ne pouvez pas besoin de redirection et le comportement par défaut peut juste faire les beaux, avoir un essai sans le
or STARTF_USESTDHANDLES
et de la création/de fixer les poignées.OriginalL'auteur Stijn Sanders
Si vous pouvez utiliser le JEDI JVCL de la bibliothèque, ils ont une belle composant encapsule CreateProcess pour vous:
http://jvcl.delphi-jedi.org/
Regarder la JvCreateProcess et JvCreateProcessExtended composants. Le JEDI JVCL est gratuit et open source est publié sous la Licence Publique de Mozilla.
OriginalL'auteur Robert Oschler