<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Funktionszeiger auf nicht statitsche Klassenmethode]]></title><description><![CDATA[<p>Ich kämpfe hier gerade mit einem kleinen Problem. Folgende Aussgangssituation:<br />
Ein Gerätetreiber bietet eine Funktion an die für eine Callbackfunktion einen Funktionszeiger erwartet. Die Funktionaliäten wollte ich in einer Klasse kapseln. Nun würde ich gerne der Funktion eine Instanz meiner Klasse mit zugehöriger Funktion übergeben, so dass sie diese aufrufen kann. Mein Code sah in etwa so aus:</p>
<pre><code class="language-cpp">typedef void (*NOTIFYPROC) (int i);
typedef void (__stdcall*FUNC)(NOTIFYPROC n);

class A
{
	FUNC DllFunc;
	Foo()
	{
		//...
		myProc = (FUNC) GetProcAddress(handle,&quot;DllFunc&quot;);
	}

	void Foo()
	{
		myProc(this-&gt;Notify);
	}

	void Notify(int i)
	{
		//...
	}
};
</code></pre>
<p>Ich verstehe, dass es so gar nicht funktionieren kann, da nur über die Adresse der Methode nicht die zugehörige Klasse übermittelt werden kann. Folglich ist mein ganzer Ansatz wohl sinnlos.</p>
<p>Nun suche ich, eine Möglichkeit, dennoch die Funktionalitäten des Treibers in eine Klasse zu kappseln, und habe keine Ahnung wie ich das angehen kann. Der Treiber ist fix, und daran kann ich auch nichts ändern. Dennoch muss dieser der zugehörigen Klasse Nachrichten über die vordefinierten Callbackfunktionen schicken können. Hat mir jemand vielleicht einen Lösungsansatz auf welche Weise man das sinnvoll verwirklichen könnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/235053/funktionszeiger-auf-nicht-statitsche-klassenmethode</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 07:24:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/235053.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 Feb 2009 08:30:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionszeiger auf nicht statitsche Klassenmethode on Wed, 25 Feb 2009 09:14:25 GMT]]></title><description><![CDATA[<p>Ich kämpfe hier gerade mit einem kleinen Problem. Folgende Aussgangssituation:<br />
Ein Gerätetreiber bietet eine Funktion an die für eine Callbackfunktion einen Funktionszeiger erwartet. Die Funktionaliäten wollte ich in einer Klasse kapseln. Nun würde ich gerne der Funktion eine Instanz meiner Klasse mit zugehöriger Funktion übergeben, so dass sie diese aufrufen kann. Mein Code sah in etwa so aus:</p>
<pre><code class="language-cpp">typedef void (*NOTIFYPROC) (int i);
typedef void (__stdcall*FUNC)(NOTIFYPROC n);

class A
{
	FUNC DllFunc;
	Foo()
	{
		//...
		myProc = (FUNC) GetProcAddress(handle,&quot;DllFunc&quot;);
	}

	void Foo()
	{
		myProc(this-&gt;Notify);
	}

	void Notify(int i)
	{
		//...
	}
};
</code></pre>
<p>Ich verstehe, dass es so gar nicht funktionieren kann, da nur über die Adresse der Methode nicht die zugehörige Klasse übermittelt werden kann. Folglich ist mein ganzer Ansatz wohl sinnlos.</p>
<p>Nun suche ich, eine Möglichkeit, dennoch die Funktionalitäten des Treibers in eine Klasse zu kappseln, und habe keine Ahnung wie ich das angehen kann. Der Treiber ist fix, und daran kann ich auch nichts ändern. Dennoch muss dieser der zugehörigen Klasse Nachrichten über die vordefinierten Callbackfunktionen schicken können. Hat mir jemand vielleicht einen Lösungsansatz auf welche Weise man das sinnvoll verwirklichen könnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1669776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1669776</guid><dc:creator><![CDATA[Halbleiter]]></dc:creator><pubDate>Wed, 25 Feb 2009 09:14:25 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger auf nicht statitsche Klassenmethode on Wed, 25 Feb 2009 08:37:27 GMT]]></title><description><![CDATA[<p>Kannst du aufrufspezifische Daten einspeichern, so wie in Win32-Fenster per SetWindowLong einen void-gecasteten this-Zeiger? Dann könntest du die Aufrufe per statischer Methode verteilen. Aber zum Selbstzweck muss man ja nun auch nicht alles in eine Klasse packen, keine Ahnung inwiefern du im konkreten Beispiel davon profitieren würdest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1669782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1669782</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 25 Feb 2009 08:37:27 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger auf nicht statitsche Klassenmethode on Wed, 25 Feb 2009 08:43:10 GMT]]></title><description><![CDATA[<p>War mein erster Gedanke, aber das kann ich leider nicht, da die Schnittstelle dafür nicht ausgelegt ist.</p>
<p>edit: Profitieren würde ich in dem Falle von dem gesammten Code der darauf aufbaut. Da das ganze die Basis eines neuen Projektes ist, würde ich das Fundament dafür gerne sauber setzten. Es existiert bereits ein anderes Projekt, welches die Schnittstelle direkt implementiert hat, und die Erfaherungen die ich damit gemacht habe, möchte ich ungern ein zweites mal machen. Daher der Wunsch das ganze zu kapseln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1669783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1669783</guid><dc:creator><![CDATA[Halbleiter]]></dc:creator><pubDate>Wed, 25 Feb 2009 08:43:10 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger auf nicht statitsche Klassenmethode on Wed, 25 Feb 2009 08:40:01 GMT]]></title><description><![CDATA[<p>Dann wirst du nicht zwischen den Instanzen unterscheiden können. Die einzige Möglichkeit die ich sehe, ist eine Singleton-Klasse. Und dann stellt sich halt auch die Frage, ob's nicht gleich normale Funktionen tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1669784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1669784</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 25 Feb 2009 08:40:01 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger auf nicht statitsche Klassenmethode on Wed, 25 Feb 2009 08:46:27 GMT]]></title><description><![CDATA[<p>Alternativ dazu dachte ich auch schon daran das ganze mit einer statischen Funktion un einem Mutex zu lösen, was dann aber logischerweise die Funktion dahingehend einschränken würde, dass bestimmte Aktionen nicht paralell ablaufen können. Das wäre mein Rettungsanker, aber ich hoffe, das jemand eine Idee hat, an die ich bisher nicht dachte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1669787</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1669787</guid><dc:creator><![CDATA[Halbleiter]]></dc:creator><pubDate>Wed, 25 Feb 2009 08:46:27 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger auf nicht statitsche Klassenmethode on Wed, 25 Feb 2009 08:48:41 GMT]]></title><description><![CDATA[<p>Kannst du mir das genauer erklären? Kann man aus dem Zeitpunkt des Callbackaufrufs schließen, welche Instanz gemeint ist? Und warum hast du mehrere gleichartige Objekte als Kapselungen für einen Treiber?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1669789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1669789</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 25 Feb 2009 08:48:41 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger auf nicht statitsche Klassenmethode on Wed, 25 Feb 2009 09:02:15 GMT]]></title><description><![CDATA[<p>Nun ich dachte daran vor dem Aufruf einer Funktion, die eine Callbackfunktion erwartet die aktuelle Instanz in einem statischen Pointer zu speichern. Die Übergebene Callbackfunktion wäre dann ebenfalls statisch, und würde anhand des Pointers die Aktionen für seine Klasse betrefend auslösen. Nach dem Abschluss (den kriege ich mit anhand bestimmter Parameter), gebe ich den Pointer wieder frei.</p>
<p>Was den Treiber angeht kann ich sagen, dass durch die gleichzeitige Nutzung keine Probleme direkter Art auftreten. Es sind Kommunikationskanäle die aufgebaut werden. Und davon können mehrere zur gleichen Zeit geöffnet werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1669798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1669798</guid><dc:creator><![CDATA[Halbleiter]]></dc:creator><pubDate>Wed, 25 Feb 2009 09:02:15 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger auf nicht statitsche Klassenmethode on Wed, 25 Feb 2009 11:42:37 GMT]]></title><description><![CDATA[<p>Was ist das für ein Treiber, der zwar mehrere Kanäle zulässt, aber bei dem man nicht herausfinden kann, auf welchem was ankam^^<br />
Aber ja, die sache mit dem statischen Memeber ist doch gut, wenn die Callback-Aufrufe nur innerhalb spezifizierter Abschnitte generiert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1669892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1669892</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 25 Feb 2009 11:42:37 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionszeiger auf nicht statitsche Klassenmethode on Wed, 25 Feb 2009 17:36:29 GMT]]></title><description><![CDATA[<p>Halbleiter schrieb:</p>
<blockquote>
<p>Nun ich dachte daran vor dem Aufruf einer Funktion, die eine Callbackfunktion erwartet die aktuelle Instanz in einem statischen Pointer zu speichern. Die Übergebene Callbackfunktion wäre dann ebenfalls statisch, und würde anhand des Pointers die Aktionen für seine Klasse betrefend auslösen. Nach dem Abschluss (den kriege ich mit anhand bestimmter Parameter), gebe ich den Pointer wieder frei.</p>
</blockquote>
<p>So, wie ich das sehe ist das der &quot;einzig&quot; sinnvolle Ansatz. Und ich denke mal, dass du da Probleme vermutest, wenn jetzt das Element, welches ankommt nicht das war, dass es geschickt hat. (Respektive du die Funktion für ein Objekt aufgerufen hast, den Zeiger gespeichert und dann kommt der nächste Funktionsaufruf und dann hast du ein Problem).<br />
Das würde ich dann so lösen, dass du da vorher so etwas, wie einen Stack hast, wo du die Zeiger drauf pusht und dann popst. Irgendetwas muss die die Lib dafür anbieten, sonst macht das mit den mehreren Kanälen wirklich nicht viel Sinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1670220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1670220</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 25 Feb 2009 17:36:29 GMT</pubDate></item></channel></rss>