Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1437 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Appel système sous Windows : pb de guillemets

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Appel système sous Windows : pb de guillemets

n°297192
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 30-01-2003 à 17:32:33  profilanswer
 

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 ?

mood
Publicité
Posté le 30-01-2003 à 17:32:33  profilanswer
 

n°297207
Taz
bisounours-codeur
Posté le 30-01-2003 à 17:40:55  profilanswer
 

"echo \"taisteu\""

n°297214
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 30-01-2003 à 17:44:53  profilanswer
 

++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
n°297236
Taz
bisounours-codeur
Posté le 30-01-2003 à 17:55:09  profilanswer
 

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

n°297249
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 30-01-2003 à 18:01:43  profilanswer
 

++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]

n°297254
Taz
bisounours-codeur
Posté le 30-01-2003 à 18:03:51  profilanswer
 

ben tu dois mal t'y prendre

n°297259
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 30-01-2003 à 18:05:26  profilanswer
 

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


---------------
J'ai un string dans l'array (Paris Hilton)
n°297260
youdontcar​e
Posté le 30-01-2003 à 18:06:04  profilanswer
 

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.

n°297269
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 30-01-2003 à 18:11:41  profilanswer
 

++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.

n°297273
Taz
bisounours-codeur
Posté le 30-01-2003 à 18:13:36  profilanswer
 

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

mood
Publicité
Posté le 30-01-2003 à 18:13:36  profilanswer
 

n°297279
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 30-01-2003 à 18:21:17  profilanswer
 

++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
n°297562
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 30-01-2003 à 23:01:16  profilanswer
 

Euppe


Message édité par Taiche le 30-01-2003 à 23:01:33
n°297673
Musaran
Cerveaulté
Posté le 31-01-2003 à 04:20:59  profilanswer
 

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
n°297708
Kristoph
Posté le 31-01-2003 à 09:29:14  profilanswer
 

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

n°297738
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 31-01-2003 à 10:14:53  profilanswer
 

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

n°297743
antp
Super Administrateur
Champion des excuses bidons
Posté le 31-01-2003 à 10:19:39  profilanswer
 

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


Message édité par antp le 31-01-2003 à 10:19:45
n°297753
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 31-01-2003 à 10:28:48  profilanswer
 

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 ?

n°297762
Kristoph
Posté le 31-01-2003 à 10:39:07  profilanswer
 

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
n°297766
antp
Super Administrateur
Champion des excuses bidons
Posté le 31-01-2003 à 10:40:35  profilanswer
 

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.

n°297771
gatorette
Posté le 31-01-2003 à 10:53:46  profilanswer
 

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
n°297773
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 31-01-2003 à 10:54:55  profilanswer
 

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
n°297801
Kristoph
Posté le 31-01-2003 à 11:47:42  profilanswer
 

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

n°297803
antp
Super Administrateur
Champion des excuses bidons
Posté le 31-01-2003 à 11:48:55  profilanswer
 

Tiens c'est bon à savoir ça... ton post aura été utile pour au moins une personne :D

n°297808
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 31-01-2003 à 12:01:18  profilanswer
 

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

n°297915
Kristoph
Posté le 31-01-2003 à 14:07:06  profilanswer
 

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.

n°297920
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 31-01-2003 à 14:12:16  profilanswer
 

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.

n°297927
Kristoph
Posté le 31-01-2003 à 14:21:02  profilanswer
 

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/

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Appel système sous Windows : pb de guillemets

 

Sujets relatifs
[VB6] erreur 430 avec Windows 98 et le FileSystemObject[PHP] sessions sous windows et sous IIS
[Delphi] Conversion date du format Unix vers format Windows[Openroad] Un bon éditeurs (outils de dev. 4GL) sous Windows ?
systeme DB2[C] Liste des processus qui tournent sur le system (windows)?
Realisation d'un driver windows xpversion du bios sous windows grace à un .bat
fermeture de windows ?Comment arrêter un Process de Windows à partir de VB???
Plus de sujets relatifs à : Appel système sous Windows : pb de guillemets


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR