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

GTK+ avec C & C++ Discussion :

g_spawn_command_line_async() ne fonctionne pas..


Sujet :

GTK+ avec C & C++

  1. #41
    Membre régulier
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par liberforce Voir le message
    Bin ça ne ressemble pas à quelque chose qu'un shell renvoie, même cmd.exe. Ça me rappelle plus quelque chose qui sort d'un IDE genre Visual Studio ou d'un Code::Blocks. Dans un shell, tu n'as que le résultat de la sortie standard et la sortie d'erreur, et je ne vois rien dans ton code de test qui pourrait renvoyer ça. C'est pour ça que je me posais des questions sur la manière dont tu invoquais les exécutables.

    Faut voir. Tu peux appeler un exécutable par son chemin absolu, s'il dépend de bibliothèques dynamiques qui ne sont pas dans le PATH, ton exécutable échouera à se lancer. C'est pour que ton exécutable de test sans dépendance te permettra de voir si le problème peut venir de là.
    Oui, je code dans Code::Blocks. Ok, je comprends. Mais j'ai les mêmes problèmes dont je parle ici, même si le code est lancé de l'extérieur de Code::Blocks. Mais je ferai attention à ça aussi. Suite au prochain numéro, probablement la semaine prochaine.

    Eric.

  2. #42
    Membre régulier
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Points : 84
    Points
    84
    Par défaut
    Bonjour,

    Après de nombreux essais, j'ai enfin trouvé la solution.

    Il m'a fallu doubler tous les anti-slash (je me suis écrit un fonction C pour cela). Mais ça aurait été trop simple.. Il faut aussi que les chaines en question ne se terminent pas par un anti-slash, doublé ou non. Il m'a fallu les virer.

    Pourquoi faire simple quand on peut faire compliqué... Pfffff!

    Ceci termine donc cette histoire qui a duré. Je passe le post en "résolu", et je remercies tout le monde ici pour l'aide précieuse.

    Cordialement, Eric.

  3. #43
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Salut,

    pour éviter de t'enquiquiner à créer des chemins, regarde g_build_path et g_build_filename ! Et en plus c'est portable
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  4. #44
    Membre régulier
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par liberforce Voir le message
    Salut,

    pour éviter de t'enquiquiner à créer des chemins, regarde g_build_path et g_build_filename ! Et en plus c'est portable
    Merci, mais deux choses cependant :

    1) Les noms et chemins que je dois argumenter ne sont pas mon fait. Ils proviennent de gtk_file_selection_get_filename(). Ils devraient déjà avoir la syntaxe qui convienne, et g_build_path() ne fera que répéter ceci. Or ce n'est apparement pas la syntaxe qui convient pour appeler correctement un exécutable avec arguments par g_spawn_command_line_async().

    2) La doc de g_build_path(), par exemple, dit clairement "At the boundary between two elements, any trailing occurrences of separator in the first element, or leading occurrences of separator in the second element are removed and exactly one copy of the separator is inserted." Or, dans le cas sur lequel j'ai planché, il faut justement - au contraire - deux éléments (i.e., deux anti-slashs) à chaque fois.

    Mais merci pour l'info en tout cas,

    Cordialement,

    Eric.

  5. #45
    Membre confirmé Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Points : 476
    Points
    476
    Par défaut
    Bonjour a tous,

    En parlant de doc, la documentation de g_spawn_command_line_async nous dis quelques chose d’intéressant :
    A simple version of g_spawn_async() that parses a command line with g_shell_parse_argv() and passes it to g_spawn_async(). Runs a command line in the background. Unlike g_spawn_async(), the G_SPAWN_SEARCH_PATH flag is enabled, other flags are not. Note that G_SPAWN_SEARCH_PATH can have security implications, so consider using g_spawn_async() directly if appropriate. Possible errors are those from g_shell_parse_argv() and g_spawn_async().

    The same concerns on Windows apply as for g_spawn_command_line_sync().
    On dirai que l'erreur vient de g_shell_parse_argv.
    Puisque l'argument de la ligne de commande provient de GtkFileChooser (pas d'injection): Pas besoin d'utiliser g_spawn_command_line_async un simple g_spawn_async suffit.

    En espérant aider,

  6. #46
    Membre régulier
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par Gaulouis Voir le message
    Puisque l'argument de la ligne de commande provient de GtkFileChooser (pas d'injection): Pas besoin d'utiliser g_spawn_command_line_async un simple g_spawn_async suffit.
    En espérant aider,
    Ok, merci, je regarderai ca. Mais - comme je l'ai dit - le problème est à présent résolu.

    Cordialement, Eric.

  7. #47
    Membre confirmé Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Points : 476
    Points
    476
    Par défaut
    le prototype de g_spawn_async() est quelque peu effarant de complexité. Voici un exemple avec l'équivalent de g_spawn_command_line_async

    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
    {
      GError *error = NULL;
      gboolean retval;
      gchar *argv[3];
      argv[0] = "del";
      argv[1] = nom_fichier;
      argv[2] = NULL;
      retval = g_spawn_async (NULL,// ici tu peu changer le répertoire de travail
                              argv,
                              NULL,
                              G_SPAWN_SEARCH_PATH,
                              NULL,
                              NULL,
                              NULL,
                              &error);
      if ( ! retval ) {
        g_warning ("%s", error->message);
      }
    }
    PS: Merci d'avoir soulevé se problème.

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/01/2004, 11h14
  2. [FP]Writeln ne fonctionne pas !
    Par néo333 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 01/11/2003, 23h47
  3. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 10h04
  4. Un Hint sur un PopupMenu ne fonctionne pas !!??
    Par momox dans le forum C++Builder
    Réponses: 6
    Dernier message: 26/05/2003, 16h48
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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