Appel système sous Windows : pb de guillemets - C++ - Programmation
Marsh Posté le 30-01-2003 à 17:44:53
++Taz a écrit : "echo \"taisteu\"" |
Quand je le mets direct dans une ligne de commande :
Citation : '"echo \"taisteu\""' is not recognized as an internal or external command, operable program or batch file. |
Marsh Posté le 30-01-2003 à 17:55:09
ben j'ai aucune idée si la commande echo existe sous windows
juste pour que tu vois que \' \" \n \t \\ etc
Marsh Posté le 30-01-2003 à 18:01:43
++Taz a écrit : ben j'ai aucune idée si la commande echo existe sous windows |
Ouais ça pas de problème, j'escape bien le tout. Mais même en faisant ça, ça foire. Pour te dire, je fais un printf de ma commande juste avant de la lancer. Une fois qu'elle a planté, j'fais copier-coller du résultat de mon printf et là ça marche
Marsh Posté le 30-01-2003 à 18:05:26
essaie ça :
"C:\\Program Files\\monprog.exe" -arg1 valeur1 -arg2 "jolie valeur avec des espaces"
Marsh Posté le 30-01-2003 à 18:06:04
tu télécharges filemon (google). il va hooker toutes les commandes de ton dur, tu n'auras qu'à chercher celle qui a planté pour voir ce que system() a tenté d'éxécuter. ça devrait te renseigner.
Marsh Posté le 30-01-2003 à 18:11:41
++Taz a écrit : ben tu dois mal t'y prendre |
Harkomodo a écrit : |
Ouais nan, en fait ça vient pas de là. Je fais bien les \\ pour les paths, j'escape bien le tout. Comme je disais plus haut, je fais printf("Executing : %s\n", cmd) puis system(cmd) derrière. Le printf est nickel et correspond pile à ce que je veux mais un copier-coller du résultat affiché marche alors que le system me balance une erreur
youdontcare : j'vais voir, merci.
Marsh Posté le 30-01-2003 à 18:13:36
moi je vois pas de problème dans
system("dir \"C:\\Program Files\"" )
Marsh Posté le 30-01-2003 à 18:21:17
++Taz a écrit : moi je vois pas de problème dans |
Bin en fait, voilà ce que j'exécute (à quelques changements de syntaxe près) :
Citation : "C:\test\bin\prog" -f "E:\Fichiers\input.dat" -output "\\machine\home\Temp Dir\temp.log" |
Le souci, c'est que si je vire les guillemets autour de C:\test... bin ça marche. Mais dans le cas où on a C:\Program Files plutôt que C:\test bin y a Ouinedoze qui me sort un truc du genre "cannot find C:\Program". Donc je mets les guillemets pour éviter ce cas-là. Mais le prog ne se lance pas avec guillemets
Marsh Posté le 31-01-2003 à 04:20:59
As-tu pensé à lire la valeur de retour de system + errno ?
Tes variables d'environnement COMSPEC et PATH sont-elles définies ?
Citation : You must explicitly flush (using fflush or _flushall) or close any stream before calling system. |
À tout hasard, essaye:
command /C tacommandeavecarguments |
ou cmd au lieu de command sous Windows NT.
Ou alors tu as un \a ou un autre truc bien sournois planqué dans ta chaîne.
Au fait, on peut utiliser / au lieu de \ comme séparateur d'arborescence.
Marsh Posté le 31-01-2003 à 09:29:14
Ouais, windows c'est pas user friendly avec les lignes de commande et les appels "system()"
Truc crade du jour N°1 : "C:\Program Files" = C:\Progra~1
Marsh Posté le 31-01-2003 à 10:14:53
Musaran a écrit : As-tu pensé à lire la valeur de retour de system + errno ? |
Oui, ça me retourne bien un code d'erreur quand ça plante, 0 quand ça passe.
Musaran a écrit : |
Oui.
Musaran a écrit :
ou cmd au lieu de command sous Windows NT. |
Déjà essayé, même problème
Musaran a écrit : |
J'ai pas essayé le coup du slash, je vais voir. En quoi \a peut-il être bloquant ?
Kristoph : je suis tout à fait d'accord, malheureusement
Marsh Posté le 31-01-2003 à 10:19:39
Pourquoi utiliser system au lieu de ShellExecute par exemple ?
Marsh Posté le 31-01-2003 à 10:28:48
antp a écrit : Pourquoi utiliser system au lieu de ShellExecute par exemple ? |
En C++ ? Alors que j'fais (ou suis censé faire) du code qui tourne aussi sous Unix ?
'fin remarque, c'est pas bête, faut que je voie. C'est du MFC ?
Marsh Posté le 31-01-2003 à 10:39:07
Si tu fais du code qui tourne aussi sous Unix, je ne saurais que trop te conseiller d'utiliser cygwin. J'ose esperer qu'avec ça, tu disposeras d'une bonne implémentation de "system" ( une qui marche )
Edit : mais pourquoi tu utilises system ??? La famille des exec?? ne serait pas plus adaptée ici ?
Marsh Posté le 31-01-2003 à 10:40:35
Bhen c'est une fonction de l'API Windows.
Je savais pas que tu voulais du code compatible Linux, mais rien ne t'empêche de faire un ifdef pour appeler ShellExecute sous Windows et system sous Linux.
Marsh Posté le 31-01-2003 à 10:53:46
ShellExecute et son grand frère, ShellExecuteEx font parti des moyens pour éxecuter des applications sous Windows (et il me semble que ce sont les méthodes recommandées par Microsoft). Ce sont des fonctions de l'API Windows (donc C) ce qui veut dire que ça fonctionne très bien sous Windows quel que soit le compilateur utilisé (du moment que tu puisse appeler des fonctions de l'API), mais cela veut aussi dire que ce n'est pas du tout portable (mais ce n'était jusqu'alors pas précisé).
Pour ton problème (en utilisant system), essaie cela :
system( "\"C:\\test\\bin\\prog.exe\" -f \"E:\\Fichiers\\input.dat\" -output \"\\\\machine\\home\\Temp Dir\\temp.log\"" ); |
et si cela ne marche pas, tu peux aussi essayer :
system( "\"C:\\test\\bin\\prog.exe\" -f \"E:\\Fichiers\\input.dat\" -output \"\\\\?\\UNC\\machine\\home\\Temp Dir\\temp.log\"" ); |
(voir cette page chez Microsoft pour une explication du "\\?\UNC" )
Edit: Rajout des .exe dans la ligne de commande. Je ne sais pas si c'est nécessaire, mais ça ne fait pas de mal.
Marsh Posté le 31-01-2003 à 10:54:55
OK, les gars, j'vais essayer avec tout ça J'vous tiens au courant des éventuelles avancées.
Kristoph : pour cygwin j'peux pas, j'fais un exécutable qui sera vendu chez les clients et j'me vois mal leur foutre cygwin en pré-requis pour faire tourner le truc sur windows De toute façon, ma hiérarchie serait contre...
antp : le ifdef c'est exactement ce que je vais faire (et fais déjà, d'ailleurs)
gatorette : merci beaucoup
Marsh Posté le 31-01-2003 à 11:47:42
Cygwin ne prend de la place que pour les dev. Quand tu fais des binaires, il te suffit de fournir cygwin??.dll avec l'exe et c'est bon.
C'est pas que j'insiste mais il ne faut pas laisser les gens sur une mauvaise impression
Marsh Posté le 31-01-2003 à 11:48:55
Tiens c'est bon à savoir ça... ton post aura été utile pour au moins une personne
Marsh Posté le 31-01-2003 à 12:01:18
Kristoph a écrit : Cygwin ne prend de la place que pour les dev. Quand tu fais des binaires, il te suffit de fournir cygwin??.dll avec l'exe et c'est bon. |
Nan mais si ça ne tenait qu'à moi, je le ferais. Le souci c'est que la politique de ma boîte est contre ce genre de trucs. Cygwin c'est freeware donc on peut pas l'inclure dans notre soft passke y a des états aux US dont la loi sitpule que si y a un bout de freeware dans le soft, alors c'est tout le soft qui est considéré comme freeware
Bref je peux pas faire comme ça même si je suis persuadé que le problème serait réglé comme ça. Merci quand même, c'est bon à savoir
Marsh Posté le 31-01-2003 à 14:07:06
Ridicule, stupide et completement archi faux. Il n'y a aucune loi de ce genre dans le monde.
MSVC??.dll est gratuite aussi et tous les programmes que tu fait avec deviennent freeware peut-etre ?
Le gars qui vous a dit ca est un escroc.
Marsh Posté le 31-01-2003 à 14:12:16
Ba en même temps c'est notre service juridique, donc n'étant pas juriste, je les laisse gérer le truc...
Ca m'a surpris aussi mais bon, j'ai peut-être mal interprété ce qui a été dit, hein. Toujours est-il que tout soft ou bout de code gratuit et pour lequel il n'y a pas de licence à payer est à proscrire.
Marsh Posté le 31-01-2003 à 14:21:02
Dans ce cas, achetez la version payante de cygwin.dll
En effet, dans le contrat de licence de la version gratuite de cygwin.dll, il est stipulé que tu dois donner le code source en même temps que les executables ( licence GPL sans doute ). Mais avec la version payante vous faites ce que vous voulez
http://www.redhat.com/software/cygwin/
Marsh Posté le 30-01-2003 à 17:32:33
Bonjour les gens,
Alors vala, ça fait une heure que je me bats avec les appels système sous Windows 2000 et la gestion des guillemets. Dans mon prog C, j'utilise system() pour appeler ma commande avec les arguments et tout. Seulement, quand je commence à mettre des guillemets autour d'arguments de ma commande, je me bouffe des erreurs. Voici ce que j'ai :
commande à lancer : "C:\Program Files\monprog.exe" -arg1 valeur1 -arg2 "jolie valeur avec des espaces"
avec monprog.exe qui est mon appli C que je suis en train de coder.
Bon bin quand je fais ça via le prog, j'ai droit à un "The filename, directory name, or volume label syntax is incorrect" alors que si je fais ça en ligne de commande, ça marche :'(
J'ai essayé plein de combinaisons différentes, même des trucs en passant par cmd /c et tout mais que dalle.
Des idées, suggestions ?