Appel système sous Windows : pb de guillemets

Appel système sous Windows : pb de guillemets - C++ - Programmation

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 ?

Reply

Marsh Posté le 30-01-2003 à 17:32:33   

Reply

Marsh Posté le 30-01-2003 à 17:40:55    

"echo \"taisteu\""

Reply

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.


 
:/


Message édité par Taiche le 30-01-2003 à 17:45:32
Reply

Marsh Posté le 30-01-2003 à 17:55:09    

ben j'ai aucune idée si la commande echo existe sous windows  :sarcastic:  
 
juste pour que tu vois que \' \" \n \t \\ etc

Reply

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  :sarcastic:  
 
juste pour que tu vois que \' \" \n \t \\ etc


 
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 [:ruisseau de larmes]

Reply

Marsh Posté le 30-01-2003 à 18:03:51    

ben tu dois mal t'y prendre

Reply

Marsh Posté le 30-01-2003 à 18:05:26    

essaie ça :
 
"C:\\Program Files\\monprog.exe" -arg1 valeur1 -arg2 "jolie valeur avec des espaces"


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

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.

Reply

Marsh Posté le 30-01-2003 à 18:11:41    

++Taz a écrit :

ben tu dois mal t'y prendre


 
 [:xp1700]  
 

Harkomodo a écrit :


essaie ça :  
 
"C:\\Program Files\\monprog.exe" -arg1 valeur1 -arg2 "jolie valeur avec des espaces"  


 
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.

Reply

Marsh Posté le 30-01-2003 à 18:13:36    

moi je vois pas de problème dans
 
system("dir \"C:\\Program Files\"" )  :??:

Reply

Marsh Posté le 30-01-2003 à 18:13:36   

Reply

Marsh Posté le 30-01-2003 à 18:21:17    

++Taz a écrit :

moi je vois pas de problème dans
 
system("dir \"C:\\Program Files\"" )  :??:  


 
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 [:ddr555]


Message édité par Taiche le 30-01-2003 à 18:24:00
Reply

Marsh Posté le 30-01-2003 à 23:01:16    

Euppe


Message édité par Taiche le 30-01-2003 à 23:01:33
Reply

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.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

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

Reply

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 :


Tes variables d'environnement COMSPEC et PATH sont-elles définies ?


 
Oui.
 

Musaran a écrit :


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.


 
Déjà essayé, même problème :/
 

Musaran a écrit :


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.


 
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 :/

Reply

Marsh Posté le 31-01-2003 à 10:19:39    

Pourquoi utiliser system au lieu de ShellExecute par exemple ? :??:


Message édité par antp le 31-01-2003 à 10:19:45
Reply

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 ?

Reply

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 :D )
 
Edit : mais pourquoi tu utilises system ??? La famille des exec?? ne serait pas plus adaptée ici ?


Message édité par Kristoph le 31-01-2003 à 10:39:57
Reply

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.

Reply

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.


Message édité par gatorette le 31-01-2003 à 10:58:45

---------------
each day I don't die is cheating
Reply

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 :D 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 :jap:


Message édité par Taiche le 31-01-2003 à 10:55:23
Reply

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 :)

Reply

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 :D

Reply

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.
 
C'est pas que j'insiste mais il ne faut pas laisser les gens sur une mauvaise impression :)


 
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 [:ddr555]
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 :)

Reply

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.

Reply

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.

Reply

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 :D
 
http://www.redhat.com/software/cygwin/

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed