Bonjour à tous.
J'ai un soucis avec un duo d'applications que je code en C++. L'une des deux a pour rôle de lancer l'autre en lui envoyant des arguments paramétrés par l'utilisateur, en utilisant la fonction _execv (présente dans process.h).
Seulement j'ai un problème juste avant d'arriver à cette étape.
Si j'ai bien compris comment cela fonctionne, cette fonction prend deux paramètres, le premier est une chaîne de caractères (const char*) indiquant l'exécutable à lancer. Le second est un tableau de chaînes de caractères (const char* const*) contenant les argument à envoyer au programme, dont le premier doit être le nom absolu de l'exécutable, et le dernier doit être nul.
Cela me pose plusieurs soucis. En premier lieu, si une de ces chaînes contient un espace, cela flanque tout par terre, car il considère les espaces comme séparateurs de chaînes. Et mettre mes chaînes entre double-quotes ne change rien. C'est une sérieux écueil car les chemins contiendrons forcément des espaces (ne serait-ce que le fameux Program Files pour l'exécutable).
Deuxièmement, mon but est de paramétrer les arguments à envoyer. Pour cela, j'utilise une fenêtre d'interface (de la librairie Qt) pour récupérer les différentes chaînes de caractères à envoyer.
Cela donne quelque chose du genre :
Les objet m_xxx sont des QLineEdit, dont on récupère le contenu avec la fonction text() sous forme de QString.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 const char* arg[5]; arg[0] = formatedString(m_execFileAbsolute->text()).toLatin1().constData(); arg[1] = formatedString(m_dataFolder->text()).toLatin1().constData(); arg[2] = formatedString(m_prefsFile->text()).toLatin1().constData(); arg[3] = formatedString(m_historicFolder->text()).toLatin1().constData(); arg[4] = 0; _execv(formatedString(m_execFileAbsolute->text()).toLatin1().constData(), arg);
La fonction formatedString sert à ajouter des doubles-quotes et/ou à supprimer les espaces.
Le couple toLatin1().constData() sert à obtenir de la QString une chaîne en (const char*).
Le lancement argumenté de mon programme échoue car, lorsque j'examine le contenu du tableau arg, je découvre que les chaînes au-delà de la première ne correspondent plus à rien, et moins encore à ce qui a été paramétré quelques lignes plus haut.
Cela fait un bon moment que je butte là-dessus, et mes tests de tâtonnage n'ont rien donné.
Je tourne sous windows 7 (32 et 64 bits) et je compile avec MinGW.
Partager