Anzeige:
Ergebnis 1 bis 10 von 10

Thema: Problem mit GTKmm in einer Shared library

  1. #1
    Registrierter Benutzer
    Registriert seit
    03.03.2007
    Beiträge
    9

    Problem mit GTKmm in einer Shared library

    Hallo Forum

    Ich habe vor für XChat ein plugin in c++ zu schreiben
    welches zusätzliche dialogfelder mittels GTKmm beinhaltet

    nur hab ich da irgendein BUG drin
    weil wenn ich das plugin lade und dann das dialogfeld benutzt ist zwar alles ok

    aber wenn ich dann einmal das plugin entlade und neu lade habe ich beim benutzten des dialogfeldes einen sofortigen crash

    hier mal die quelle zum testplugin :
    Code:
    #include <gtkmm.h> 
    // c++ `pkg-config gtkmm-2.4 --cflags --libs` -Wall -O1 -shared -fPIC  gtkmm.cpp -o gtkmm.so
    extern "C" 
    {
       #include "xchat/xchat-plugin.h"
    }
    
    #define PNAME "Test"
    #define PDESC "Blahs";
    #define PVERSION "0.1"
    
    static xchat_plugin *ph; 
    
    
    static int test_cb(char *word[], char *word_eol[], void *userdata) 
    { 
        Gtk::Main main(0,NULL);
        Gtk::Window window_obj; 
        main.run(window_obj); 
        return 0; 
    }
    
    extern "C"
    {
       int xchat_plugin_init(xchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version,char *arg);
    }
    
    void xchat_plugin_get_info(char **name, char **desc, char **version, void **reserved)
    {
       *name = PNAME;
       *desc = PDESC;
       *version = PVERSION;
    }
    
    int xchat_plugin_init(xchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version,char *arg)
    {
       ph = plugin_handle;
       
       *plugin_name = PNAME;
       *plugin_desc = PDESC;
       *plugin_version = PVERSION;
    
       xchat_hook_command(ph, "test", XCHAT_PRI_NORM, test_cb, "Usage: Test YES", 0);
      
    
       xchat_print(ph, "Test plugin loaded!\n");
    
       return(1);
    }
    und hier auch mal einen kleinen auszug der meldungen die beim neu laden im terminal ausgegeben werden
    Code:
    (xchat:4719): GLib-GObject-WARNING **: cannot register existing type `gtkmm__PangoContext' 
    
    (xchat:4719): GLib-GObject-WARNING **: cannot register existing type `gtkmm__PangoFont' 
    
    (xchat:4719): GLib-GObject-WARNING **: cannot register existing type `gtkmm__PangoFontFace' 
    
    (xchat:4719): GLib-GObject-WARNING **: cannot register existing type `gtkmm__PangoFontFamily'
    soweit ich es herausfinden konnte muss es wohl irgendwie mit dem
    Code:
    Gtk::Main main(0,NULL);
    zusammenhängen

    bin für jede hilfe dankbar

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Falls Gtk::Main die Haupteventloop von gtkmm ist, sollte das Plugin besser die Eventloop des Programms mitbenutzen.

    Hast du schon probiert das main Objekt nicht anzulegen (und main.run nicht zu verwenden)?

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Registriert seit
    03.03.2007
    Beiträge
    9
    dann passiert das :
    Code:
    (xchat:3598): GLib-GObject-CRITICAL **: g_object_set_qdata_full: assertion `quark > 0' failed
    Speicherzugriffsfehler
    und zwar direkt beim ersten aufruf des dialoges

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Hmm, XChat ist aber schon eine GTK+ Anwendung oder?

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer
    Registriert seit
    03.03.2007
    Beiträge
    9
    ähm ... ja

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    In dem Versuch, wo du das Main Objekt weglässt, hast du dort den Dialog auch am Heap angelegt (also mit new)?

    Falls ja, bzw. falls das nichts ändert, eventuell auch das Main Objekt aber nicht mit run() starten

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  7. #7
    Registrierter Benutzer
    Registriert seit
    03.03.2007
    Beiträge
    9
    sry aber das versteh ich nun nicht :-)
    könntest du das mit nem kleinen beispiel verdeutlichen ?

  8. #8
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Hmm, scheint hier keiner zu wissen

    Besser du suchst mal nach einer Mailingliste von gtkmm und fragst, wie man gtkmm Code als Plugin in einer GTK+ Applikation verwendet.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  9. #9
    Registrierter Benutzer
    Registriert seit
    03.03.2007
    Beiträge
    9
    ne mailinglist zu finden ist nicht das problem^^
    http://www.gtkmm.org/mailinglist.shtml

    was schwieriger wird ist die verständigung (ich kann kein englisch) :-(

  10. #10
    Registrierter Benutzer
    Registriert seit
    05.09.2002
    Ort
    Neuhausen
    Beiträge
    320
    Ich denke der Fehler liegt in dem besagten gtk::main, der mit dem Main-Loop von XChat Probleme verursacht. Lass das weg, auch das main.run(). Das Fenster musst du vermutlich mit window_obj.show() bzw. show_all() anzeigen lassen.
    Auch das von anda_skoa bemängelte Anlegen auf dem Stack ist nicht sauber, da das Objekt ja am Ende der Funktion wieder zerstört wird. Hier ist natürlich fraglich, wie die GObjekte in GTKmm implementiert sind, aber um sicher zu sein würde ich das Fenster mit new() auf dem Heap anlegen.

    Gruss, Andy

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •