🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.lang.c++
Article #1247

Re: Funktionszeiger auf Klassenmethoden

#1247
From: Reinhard Pfau
Date: Fri, 12 Jan 1996 11:49
55 lines
3049 bytes
Karl-Heinz Krause (Krause@t-online.de) wrote:
[ DEL: ... ]
: Das ist keine Lvsung des Problems. Sicher, hier in diesem Beispiel
: funktioniert es. Es ging mir aber vor allem um folgenden Fall: Gegeben
: sei eine Systemfunktion SyFu, die als Parameter einen Funktionszeiger
: erwartet.
: 	void SyFu (int(*fptr)());

Ach so, darum ging es.. (*Groschen fall*)

: Die |bergebene Funktion wird dann vom Betriebssystem bei Eintreten
: bestimmter Ereignisse aufgerufen. Sowas kommt bei GUI-Programmierung
: hdufig vor, ebenso bei Netzwerkprogrammierung; |berhaupt immer dann,
: wenn auf asynchrone Ereignisse reagiert werden soll.

Yep. Gerade im Zusammenhang mit Netzwerkprogrammierung hatte ich mal
das gleiche Problem.

: Ich will jetzt an SyFu eine Funktion |bergeben, die die Methode "method"
: f|r das bestimmte X-Objekt "a" aufruft. Wenn gebundene Methoden
: existieren w|rden, wdre das einfach:
: 	SyFu (a.method);
[ DEL: ... ]

: In der Praxis benutzt man dazu folgenden Trick: Man setzt an den Anfang
: eines Xmethod-Objekts einige zusdtzliche Bytes, die im wesentlichen die
: Maschinencodes f|r einen Funktionsaufruf enthalten. Dadurch wird
: erreicht, da_ die Adresse eines Xmethod-Objekts auch als Adresse einer
: Funktion betrachtet werden kann, die beim Aufruf gerade das Gew|nschte
: macht, ndmlich
: 	(fptr.object)->*(fptr.method)

: Karl-Heinz Krause

Tja, genau diesen Trick habe ich in eine Funktion eingebaut, die mir
aus einem Zeiger auf die Objekt-Instanz, einem Zeiger auf die Member-
Funktion und einer Parameterbeschreibung dynamisch Maschinencode erzeugt,
der den Aufruf der Methode korrekt abwickelt.
Diesen Code speicher ich in einer Variablen des Objektes ab (bzw. den 
Zeiger darauf), so dass jede Instanz ihren eigenen Proxy-Code besitzt.

Die Parameterbeschreibung dient dazu, Parameter aus Prozessorregistern
C++-konform auf dem Stapel zu legen (, und evtl. wieder zurueckzugeben).
Dies ist sehr praktisch, da Systemfunktionen ihre Parameter gerne in
Registern uebergeben.

Portabel ist das ganze natuerlich nicht mehr. (Meine Version ist fuer
PC's ab 386, BC++/TC++, ??DOS.)

Reinhard.
--
 /-- Reinhard Pfau --- (ED-Pfau) --------------------------------------------\
| eMail: gz342@appl2.hrz.uni-siegen.de  |  IRC: Mubo  | no home-page         |
+----------------------------------------------------------------------------+
|  "Keyboard error - press F1 to continue"   (PC-BIOS)                       |
Technical Details
Message-ID: <4d5hsn$5k8@si-nic.hrz.uni-siegen.de>
Path: arc1-ca.pugleaf.net!appl2.hrz.uni-siegen.de!gz342
References: <48fv1i$paf@sparcserver.lrz-muenchen.de> <1996Jan2.133329.19321@conline.central.de> <4chcqr$vuh@news00.btx.dtag.de> <60KicbrocDB@faerber.muc.de> <4cujoo$vjd@news00.btx.dtag.de>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!appl2.hrz.uni-siegen.de!gz342
From: gz342@appl2.hrz.uni-siegen.de (Reinhard Pfau)
Newsgroups: de.comp.lang.c++
Subject: Re: Funktionszeiger auf Klassenmethoden
Date: 12 Jan 1996 11:49:43 GMT
Organization: HRZ, UNI/GHS Siegen
Message-ID: <4d5hsn$5k8@si-nic.hrz.uni-siegen.de>
References: <48fv1i$paf@sparcserver.lrz-muenchen.de> <1996Jan2.133329.19321@conline.central.de> <4chcqr$vuh@news00.btx.dtag.de> <60KicbrocDB@faerber.muc.de> <4cujoo$vjd@news00.btx.dtag.de>
NNTP-Posting-Host: appl2.hrz.uni-siegen.de
X-Newsreader: TIN [version 1.2 PL2]