IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Appel de ShellExecute avec parametres contenant des espaces. [Langage/Algorithme]


Sujet :

C++Builder

  1. #1
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 395
    Par défaut Appel de ShellExecute avec parametres contenant des espaces.
    Bonjour,

    je vois dans la doc de ShellExecuteInfo que les différents parametres à passer à ShellExecute doivent l'être séparés par des espaces.

    Comment faire si au moins 1 parametre (chemin de fichier) contient aussi au moins un espace.

    Merci pour vos conseils.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    //---------------------------------------------------------------------------
    //# bool TForm1::Execute(FileName)
    //   Execute an application
    //---------------------------------------------------------------------------
    void __fastcall  TVisdrawForm1::Execute_Program(String FileName, String  parametres)
    {
      SHELLEXECUTEINFO execinfo;      // Structure ShellExecute(Ex) info
    
      //typedef struct _SHELLEXECUTEINFO {
      //	DWORD cbSize;
      //	ULONG fMask;
      //	HWND hwnd;
      //	LPCTSTR lpVerb;
      //	LPCTSTR lpFile;
      //	LPCTSTR lpParameters;
      //	LPCTSTR lpDirectory;
      //	int nShow;
      //	HINSTANCE hInstApp;
      //	LPVOID lpIDList;
      //	LPCTSTR lpClass;
      //	HKEY hkeyClass;
      //	DWORD dwHotKey;
      //	union {
      //		HANDLE hIcon;
      //		HANDLE hMonitor;
      //	} DUMMYUNIONNAME;
      //	HANDLE hProcess;
      //} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;
     String action;                                 // action to run
    
      action =  "open";
      memset(&execinfo, 0, sizeof(execinfo));
      execinfo.lpFile = FileName.c_str();          // programme
      execinfo.cbSize = sizeof(execinfo);
      execinfo.lpVerb = action.c_str();             // Action = Open
      execinfo.fMask = SEE_MASK_NOCLOSEPROCESS;
      execinfo.nShow = SW_SHOWDEFAULT;
      execinfo.lpParameters = parametres.c_str();   // Parms
      execinfo.nShow = SW_SHOW;
      ShellExecuteEx(&execinfo);

  2. #2
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 395
    Par défaut
    Bon, j'avance au prix de recherches bien fastidieuses.

    J'ai trouvé ici l'information suivante :

    If it is more convenient, you can set the first parameter to NULL and put the entire command line in the second parameter. If you do that, and if the program pathname contains any embedded spaces, be sure to enclose that part of the command line in double quotes.
    J'en déduis que pour les parametres en tant que tel, la logique est la même.
    mais concrétement, mes parametres étant les suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void __fastcall TVisdrawForm1::Install_Update(String Install_Request, String Update_Folder, Update_Program, String Current_Parm)
    {
    	Programme = Update_Folder + Update_Program;
    	// Parms : 1) Install request (/Install or /Update)
    	//         2) Update Folder
    	//         3) Update Program
    	//         4) Current Parms (to be reused later)
    	Parametres = Install_Request + " " + Update_Folder + " " + Update_Program + " " + Current_Parm;
    	LogItem("Prepare call to " +  Programme);
    	LogItem("+---> Using parms ["  + Parametres + "]");
     
    	Execute_Program(Programme, Parametres);
    et l'espace se situant dans Update_Folder, ou faut-il rajouter des quotes, et comment ?

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Là tu as ajoutés des espaces mais pas le "

    Disons que Update_Folder et Update_Program peuvent contenir des espaces, classiques si c'est chemin comme "C:\Program Files\Embarcadero\RAD Studio"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Install_Request + " \"" + Update_Folder + "\" \"" + Update_Program + "\" " + Current_Parm;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Je ne sais pas si tous tes paramètres ont des espaces mais en C++, je dirais qu'il faut un truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Parametres = "\"" + Install_Request + "\" \"" + Update_Folder + "\" \"" + Update_Program + "\" \"" + Current_Parm + "\"";
    Ce qui encapsule tous tes paramètres avec les guillemets.

    PS : erf, je me suis fait doublé.

  5. #5
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 395
    Par défaut


    J'ai encore pas mal de ficèles à apprendre.

    Ca fonctionne maintenant Nickel.

    (Loi de la vexation universelle oblige, pas moyen de trouver sur le net la moindre doc ou le moindre exemple d'utilisation de ShellExecute avec plusieurs parametres et qui contiennent au moins 1 blanc. Voilà qui est corrigé !)

    Et merci surtout pour votre rapidité d'intervention.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 18/11/2013, 18h43
  2. [Batch] récupération plusieurs parametres contenant des espaces
    Par julioclay dans le forum Scripts/Batch
    Réponses: 7
    Dernier message: 06/01/2011, 22h24
  3. Réponses: 1
    Dernier message: 19/08/2009, 13h19
  4. Réponses: 9
    Dernier message: 29/04/2008, 13h38
  5. Paramètres contenants des espaces
    Par ujoodha dans le forum Linux
    Réponses: 1
    Dernier message: 12/05/2006, 12h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo