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 :

Utilisation de GModule : un plantage lors du g_module_symbol()


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Par défaut Utilisation de GModule : un plantage lors du g_module_symbol()
    Bonjour à tous,

    Suite à une (grosse) prise de tête avec les wxWidgets, j'ai décidé de me mettre à GTK+ . J'ai créé mes premières fenêtres sans problème grâce au cours de Nicolas Joseph (merci à lui au passage) et j'ai décidé de me faire la main avec GModule.

    Cepandant je rencontre un plantage pur et simple (le programme retourne 1 sans autre forme de procès) lors de l'appel de la fonction g_module_symbol().

    Voici mon code :
    (les MessageBoxes de Windows sont là à titre de test et uniquement à titre de test, ne pensez pas que je mélange deux GUI (GTK et Win32) en temps normal)

    main.cpp (application)
    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
    #include <gtk/gtk.h>
    #include <windows.h>
     
    int main(int argc, char **argv)
    {
     
        //On ouvre la dll
        GModule* dll = g_module_open("gtkdll."G_MODULE_SUFFIX, G_MODULE_BIND_MASK);
     
        if(dll != NULL)
        {
     
            //On cherche le symbole
            gpointer* msb_x;
            g_module_symbol(dll, "msb", msb_x);
    MessageBox(NULL,"CpAC","CpaC",MB_OK);
            void (*msb_r)(int, char**) = (void(*)(int, char**))msb_x;
     
            msb_r(argc, argv);
     
     
            //On ferme la dll
            g_module_close(dll);
        }
     
        return 0;
    }
    main_dll.cpp (librairie dynamique)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <gtk/gtk.h>
    #include <windows.h>
     
    extern "C" __declspec(dllexport) void msb(int argc, char** argv)
    {
        MessageBox(NULL,"Test","test",MB_OK);
    }
    Merci d'avance de votre aide!

    Sp@rtan03

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour,

    Citation Envoyé par Spartan03
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        GModule* dll = g_module_open("gtkdll."G_MODULE_SUFFIX, G_MODULE_BIND_MASK);
    Pour construire le nom de ton module tu as g_module_build_path

    Citation Envoyé par Spartan03
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            gpointer* msb_x;
            g_module_symbol(dll, "msb", msb_x);
    Le problème est ici, la fonction utilise un gpointer** pour pouvoir "retourner" une valeur, il faut donc écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            gpointer msb_x;
            g_module_symbol(dll, "msb", &msb_x);

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Par défaut
    Merci beaucoup, ça marche nickel maintenant!

    Pour le g_module_build_path() je n'avais pas fais attention à cette fonction dans la doc, ceci dit ça marche avec "gtkdll."G_MODULE_SUFFIX mais c'est vrai que ce n'est pas très propre.

    Je vais donc me mettre à g_module_build_path() sur le champ!

    Bonne soirée!

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/08/2012, 13h59
  2. Réponses: 6
    Dernier message: 21/04/2010, 15h56
  3. plantage lors de l'utilisation d'un vector
    Par isoman dans le forum C++
    Réponses: 7
    Dernier message: 20/05/2008, 10h13
  4. plantage lors de mon free
    Par salseropom dans le forum C
    Réponses: 16
    Dernier message: 17/02/2006, 18h43
  5. plantage lors de réception de fihier
    Par marsupile dans le forum C++Builder
    Réponses: 9
    Dernier message: 22/01/2004, 18h08

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