Beiträge: 49
Themen: 6
Registriert seit: Sep 2013
Bewertung:
0
25.09.2013, 15:50
(Dieser Beitrag wurde zuletzt bearbeitet: 26.09.2013, 17:48 von Freakazoid.)
Also, ich habe mal dir ganzes free()´s auskommentiert, kompiliert und eingefügt. Tadaaa es stürzt nicht mehr ab.
Ich bekomme folgende Ausgabe:
(14:49:47) plugin-call-a-buddy: Variablen wurden initialisiert.
(14:49:47) plugin-call-a-buddy: Node Konvertiert und Acc geholt.
(14:49:47) plugin-call-a-buddy: GC wird geholt.
(14:49:47) plugin-call-a-buddy: Hole Protocol.
(14:49:47) plugin-call-a-buddy: Plugin_Protocol_INFO wird geholt.
(14:49:47) plugin-call-a-buddy: Entsprechende Infos werden ermittelt
(14:49:47) plugin-call-a-buddy: Notify_Get_UI_Ops
(14:49:47) plugin-call-a-buddy: EDIT von Freakazoid: Trash entfernt
(14:49:52) plugin-call-a-buddy: Variablen wurden initialisiert.
(14:49:52) plugin-call-a-buddy: Node Konvertiert und Acc geholt.
(14:49:52) plugin-call-a-buddy: GC wird geholt.
(14:49:52) plugin-call-a-buddy: Hole Protocol.
(14:49:52) plugin-call-a-buddy: Plugin_Protocol_INFO wird geholt.
(14:49:52) plugin-call-a-buddy: Entsprechende Infos werden ermittelt
(14:49:52) plugin-call-a-buddy: Notify_Get_UI_Ops
(14:49:52) plugin-call-a-buddy: EDIT von Freakazoid: Trash entfernt
Beiträge: 1,174
Themen: 15
Registriert seit: Nov 2007
Bewertung:
4
Ich denke, du hattest die free()s eingebaut, weil es abstürzt? Aber ja, auf Verdacht free() einbauen führt zu mehr Problemen als das es löst.  Ein free() zu wenig führt "nur" zu unnötig erhöhtem Speicherverbrauch.
Die komischen Zeichen kommen übrigens, weil du einen Zeiger auf eine Funktion auf eine Zeichenkette castest und dann anzeigst. So etwas verrücktes geht unter C nicht, denn an der Stelle, wo der Zeiger hinzeigt steht ja nur Maschinencode und keine richtige Zeichenkette.
Welche Pidgin-Version setzt du ein?
Welches Betriebssystem?
Was sagt das Debug-Fenster?
Beiträge: 49
Themen: 6
Registriert seit: Sep 2013
Bewertung:
0
26.09.2013, 10:07
(Dieser Beitrag wurde zuletzt bearbeitet: 26.09.2013, 10:07 von jamesv1994.)
Guten Morgen,
ich hatte die free()s eingebaut, da das Plugin bei einer zweiten Ausführung immer abgestürzt ist.
Jetzt funktionieren auch mehrfache Ausführungen.
Zitat:Die komischen Zeichen kommen übrigens, weil du einen Zeiger auf eine Funktion auf eine Zeichenkette castest und dann anzeigst. So etwas verrücktes geht unter C nicht, denn an der Stelle, wo der Zeiger hinzeigt steht ja nur Maschinencode und keine richtige Zeichenkette. Wink
Zitat:[c]
notify_userinfo_ori = ops->notify_userinfo;
purple_debug_warning("plugin-call-a-buddy", (char*)notify_userinfo_ori);
[/c]
Wie kann ich dann das notify_userinfo_ori weiterverarbeiten? Das ist ein Zeiger, auf eine Zeichenkette, dann gibt es bestimmt eine Funktion, pointer_to_char oder so, oder?
Oder stehen in dem notify_userinfo_ori gar nicht die User-Infos?
Vielen Dank für deine Hilfe!
Beiträge: 49
Themen: 6
Registriert seit: Sep 2013
Bewertung:
0
also ich habe mir mal ein Kapitel zu Zeigern in C angeschaut. Dort steht drin, dass der Wert mit dem * zurückgegeben wird, also brauche ich [c]*notify_userinfo_ori[/c]
Dann bekomme ich aber folgendes:
Zitat: 2 IntelliSense: argument of type "void *(*)(PurpleConnection *gc, const char *who, PurpleNotifyUserInfo *user_info)" is incompatible with parameter of type "const char *" c:\local\dev\lokale_entwicklungen\james\trunc\pidgin-plugin\test-plugin\test.cpp 96 46 Test-Plugin
Wenn ich nun einfach mal folgendes probiere:
[c]
(char*)*notify_userinfo_ori
[/c]
Dann bekomme ich wieder diese Zeichen.
Ich weiß nun, dass [c]notify_userinfo_ori[/c] vom Typ [c]void *(*)(PurpleConnection *gc, const char *who, PurpleNotifyUserInfo *user_info)[/c] ist. Aber leider habe ich keine weiteren Informationen über diesen Dateityp. Ich weiß ja noch nicht mal, was das für ein Dateityp sein soll
LG James
Beiträge: 49
Themen: 6
Registriert seit: Sep 2013
Bewertung:
0
Allsoooo:
Ich habe nun folgendes ermittelt:
[c]
ops->notify_userinfo = birthday_reminder_notify_userinfo;
purple_debug_warning("plugin-call-a-buddy", "Birthday_Reminder_Notify_Userinfo \n");
[/c]
Ist dafür verantwortlich, dass das Plugin(eher Pidgin) bei der zweiten Ausführung abstürzt.
Der Code ist so ziemlich der gleiche geblieben, falls du mehr Code brauchst...
Beiträge: 1,174
Themen: 15
Registriert seit: Nov 2007
Bewertung:
4
Ich habe gerade keine Zeit, alles zu lesen (mache ich später, keine Sorge).
Aber eine Bitte habe ich: wenn du dir Speicher ausgeben lässt, indem keine Zeichenkette steht, und dabei Trash herauskommt, poste den Trash bitte nicht in's Forum. Du machst damit die RSS-Feeds kaputt (weswegen ich dir auf deine letzten Posts auch nicht antworten konnte  ). Ich habe deinen Text oben editiert, kannst du ja ggf. in Zukunft genauso machen.
PS: Ja ich weiß, dass das ein ordentlich programmiertes Forum eigentlich abkönnen müsste. Kann es aber nicht und ich habe gerade keine Zeit, mir das anzuschauen.
Welche Pidgin-Version setzt du ein?
Welches Betriebssystem?
Was sagt das Debug-Fenster?
Beiträge: 49
Themen: 6
Registriert seit: Sep 2013
Bewertung:
0
Guten Morgen,
Oh, natürlich werde ich das nächste Mal den Trash einfach als "Trash" kennzeichnen 
Ach mach dir keinen Stress, sollte vielleicht kommuniziert werden, dann wird das keiner mehr machen
Beiträge: 1,174
Themen: 15
Registriert seit: Nov 2007
Bewertung:
4
Der Typ [c]void *(*)(PurpleConnection *gc, const char *who, PurpleNotifyUserInfo *user_info)[/c] kennzeichnet einen Zeiger auf eine Funktion. Da sind keine Daten dahinter, die man irgendwie (sinnvoll) ausgeben kann, sondern das ist die Speicheradresse, an der der Programmcode steht, der aufgerufen wird, wenn das Protokollplugin die Nutzerinformationen zusammengesammelt hat. Das Besondere ist eben, dass man die Adresse ändern kann. Wenn du dort also mit [c]ops->notify_userinfo = birthday_reminder_notify_userinfo;[/c] die Adresse deiner Funktion hineinschreibt[1], wird beim nächsten Aufruf nicht die Funktion von Pidgin sondern deine eigene aufgerufen. Und die bekommt dann das [c]PurpleNotifyUserInfo *user_info[/c] übergeben, das du weiterverarbeiten kannst.
[1] Der Name einer Funktion ohne Klammern dahinter entspricht der Speicheradresse, an der der Programmcode der Funktion beginnt.
Welche Pidgin-Version setzt du ein?
Welches Betriebssystem?
Was sagt das Debug-Fenster?
Beiträge: 49
Themen: 6
Registriert seit: Sep 2013
Bewertung:
0
Hey, danke für deine Hilfe, aber genau diese Zeile bereitet mir ja Probleme im Plugin...
Vielleicht habe ich was falsch gemacht?
[c]
static void *(*notify_userinfo_ori)(PurpleConnection *gc, const char *who, PurpleNotifyUserInfo *user_info);
ops = purple_notify_get_ui_ops();
purple_debug_warning("plugin-call-a-buddy", "Notify_Get_UI_Ops \n");
notify_userinfo_ori = ops->notify_userinfo;
...
ops->notify_userinfo = call_a_buddy_notify_userinfo;
[/c]
Siehst du da einen Fehler? Wenn nicht, muss ich mir das noch mal in Ruhe angucken
Beiträge: 1,174
Themen: 15
Registriert seit: Nov 2007
Bewertung:
4
Gib mir bitte nochmal deinen aktuellen Stand. In den drei Zeilen ist alles in Ordnung und deinen alten Stand habe ich auf die Schnelle auch nichts gefunden.
Welche Pidgin-Version setzt du ein?
Welches Betriebssystem?
Was sagt das Debug-Fenster?
|