<?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[Typedef in einer Klasse verwenden]]></title><description><![CDATA[<p>Zuerst einmal Hallo an alle,<br />
hoffe das ich hier ein wenig lernen kann und evtl sogar etwas von meinem Wissen weitergeben kann.</p>
<p>Leider fängt alles erstmal mit einem Problem an <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":-/"
      alt="😕"
    /></p>
<p>Geschichte drum herum:<br />
Ich möchte für einen LCD-Bildschirm mit hilfe der Logitech LCD SDK ein eigenes Plugin programmieren. Habe schon Erfahnung in PHP, Perl und Java. (Alles sehr System-nahme Sprachen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> )</p>
<p>Soo. bei dem LCD-Bildschirm sind auch Buttons dabei, welche mit dem SDK angesprochen werden können. Ich möchte eine eigene Callback-Funktion implementieren, um auf die Tastendrücke zu reagieren.</p>
<p>Die Funktion soll laut TypeDef wie folgt aussehen:</p>
<pre><code class="language-cpp">// Callback used to notify client of soft button change
typedef DWORD (WINAPI *lgLcdOnSoftButtonsCB)(IN int device, IN DWORD dwButtons, IN const PVOID pContext);
</code></pre>
<p>Das ganze Funktioniert auch, wenn ich eine einfache Methode erstelle, welche in keiner Klasse liegt. Also z.b:</p>
<pre><code class="language-cpp">DWORD myCallback(IN int device, IN DWORD dwButtons, IN const PVOID pContext)
{
	return 1;	
}
</code></pre>
<p>Da ich das ganze Objekt-Orientiert umsetzen möchte, implementieren ich die Funktion für den Callback wie folgt:<br />
LCDMain.h</p>
<pre><code class="language-cpp">class CLCDMain
{
public:
DWORD buttonCallback(IN int device, IN DWORD dwButtons, IN const PVOID pContext);

....
</code></pre>
<p>LCDMain.cpp</p>
<pre><code class="language-cpp">CLCDMain::CLCDMain()
{
	//Einige Zeilen
	//Temp-Variable for Button-Callback
	lgLcdOnSoftButtonsCB myFuncButtonCallback;
	myFuncButtonCallback = &amp;CLCDMain::buttonCallback;

	openContext.onSoftbuttonsChanged.softbuttonsChangedCallback = myFuncButtonCallback;

}
//Einige Zeilen

DWORD CLCDMain::buttonCallback(IN int device, IN DWORD dwButtons, const IN PVOID)
{
return 1;
}
</code></pre>
<p>Dabei kommt aber leider folgender Fehler:</p>
<pre><code>1&gt;e:\privat\programmieren\cpp\lcd\lcd\lcdmain.cpp(13) : error C2440: '=': 'DWORD (__thiscall CLCDMain::* )(int,DWORD,const PVOID)' kann nicht in 'lgLcdOnSoftButtonsCB' konvertiert werden
1&gt;        Es gibt keinen Kontext, in dem diese Konvertierung möglich ist
</code></pre>
<p>Ist das ganze zu lösen oder ist dabei eine größere Veränderung in dem SDK nötig?<br />
Falls das möglich ist, gibts Tipps oder Schlüsselwörter über die ich mich schlau mache kann?<br />
Danke für jede Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/282871/typedef-in-einer-klasse-verwenden</link><generator>RSS for Node</generator><lastBuildDate>Sat, 22 Aug 2026 21:52:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/282871.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 28 Feb 2011 13:36:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Typedef in einer Klasse verwenden on Mon, 28 Feb 2011 13:36:46 GMT]]></title><description><![CDATA[<p>Zuerst einmal Hallo an alle,<br />
hoffe das ich hier ein wenig lernen kann und evtl sogar etwas von meinem Wissen weitergeben kann.</p>
<p>Leider fängt alles erstmal mit einem Problem an <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":-/"
      alt="😕"
    /></p>
<p>Geschichte drum herum:<br />
Ich möchte für einen LCD-Bildschirm mit hilfe der Logitech LCD SDK ein eigenes Plugin programmieren. Habe schon Erfahnung in PHP, Perl und Java. (Alles sehr System-nahme Sprachen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> )</p>
<p>Soo. bei dem LCD-Bildschirm sind auch Buttons dabei, welche mit dem SDK angesprochen werden können. Ich möchte eine eigene Callback-Funktion implementieren, um auf die Tastendrücke zu reagieren.</p>
<p>Die Funktion soll laut TypeDef wie folgt aussehen:</p>
<pre><code class="language-cpp">// Callback used to notify client of soft button change
typedef DWORD (WINAPI *lgLcdOnSoftButtonsCB)(IN int device, IN DWORD dwButtons, IN const PVOID pContext);
</code></pre>
<p>Das ganze Funktioniert auch, wenn ich eine einfache Methode erstelle, welche in keiner Klasse liegt. Also z.b:</p>
<pre><code class="language-cpp">DWORD myCallback(IN int device, IN DWORD dwButtons, IN const PVOID pContext)
{
	return 1;	
}
</code></pre>
<p>Da ich das ganze Objekt-Orientiert umsetzen möchte, implementieren ich die Funktion für den Callback wie folgt:<br />
LCDMain.h</p>
<pre><code class="language-cpp">class CLCDMain
{
public:
DWORD buttonCallback(IN int device, IN DWORD dwButtons, IN const PVOID pContext);

....
</code></pre>
<p>LCDMain.cpp</p>
<pre><code class="language-cpp">CLCDMain::CLCDMain()
{
	//Einige Zeilen
	//Temp-Variable for Button-Callback
	lgLcdOnSoftButtonsCB myFuncButtonCallback;
	myFuncButtonCallback = &amp;CLCDMain::buttonCallback;

	openContext.onSoftbuttonsChanged.softbuttonsChangedCallback = myFuncButtonCallback;

}
//Einige Zeilen

DWORD CLCDMain::buttonCallback(IN int device, IN DWORD dwButtons, const IN PVOID)
{
return 1;
}
</code></pre>
<p>Dabei kommt aber leider folgender Fehler:</p>
<pre><code>1&gt;e:\privat\programmieren\cpp\lcd\lcd\lcdmain.cpp(13) : error C2440: '=': 'DWORD (__thiscall CLCDMain::* )(int,DWORD,const PVOID)' kann nicht in 'lgLcdOnSoftButtonsCB' konvertiert werden
1&gt;        Es gibt keinen Kontext, in dem diese Konvertierung möglich ist
</code></pre>
<p>Ist das ganze zu lösen oder ist dabei eine größere Veränderung in dem SDK nötig?<br />
Falls das möglich ist, gibts Tipps oder Schlüsselwörter über die ich mich schlau mache kann?<br />
Danke für jede Hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2027650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2027650</guid><dc:creator><![CDATA[Hu5eL]]></dc:creator><pubDate>Mon, 28 Feb 2011 13:36:46 GMT</pubDate></item><item><title><![CDATA[Reply to Typedef in einer Klasse verwenden on Mon, 28 Feb 2011 13:56:05 GMT]]></title><description><![CDATA[<p>Schau dir mal Zeiger auf klasseninterne Methoden an. Dein typedef ist für Zeiger auf freie Funktionen.</p>
<p>Wenn du dir Arbeit sparen willst, schau dir std::function oder den entsprechenden Boost-Teil an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2027656</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2027656</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Mon, 28 Feb 2011 13:56:05 GMT</pubDate></item><item><title><![CDATA[Reply to Typedef in einer Klasse verwenden on Mon, 28 Feb 2011 14:02:03 GMT]]></title><description><![CDATA[<p>Ah. Da hast du dir als erstes Problem gleich hübsch was ausgesucht.</p>
<p>Das Problem ist der Unterschied zwischen Funktionszeigern und Methodenzeigern. Zum einen haben Methoden einen versteckten Parameter this, der durch den Funktionszeiger nicht erschlagen wird, zum anderen macht die Möglichkeit virtueller Methoden Methodenzeiger zu einer etwas komplexeren Angelegenheit. Es ist dementsprechend nicht möglich, eine Methode in einen Funktionszeiger zu stopfen.</p>
<p>APIs dieser Art erlauben es aber üblicherweise, einen Kontext mitgeben, der wieder an die Callback-Funktion durchgereicht wird; das wird in deinem Fall wohl pContext sein. Die Lösung deines Problems ist wahrscheinlich, eine Funktion wie folgt zu schreiben:</p>
<pre><code class="language-cpp">DWORD myCallback(IN int device, IN DWORD dwButtons, IN const PVOID pContext)
{
  CLDCMain *self = reinterpret_cast&lt;CLDCMain*&gt;(pContext);

  self-&gt;buttonCallback(device, dwButtons);
}
</code></pre>
<p>...und einen Zeiger auf das Objekt als Kontext mitzugeben, wenn du den Callback registrierst.</p>
<p>Wenn es sich bei der Callbackerei nicht um eine externe Bibliothek handelt und du das API umstrukturieren kannst, könnte man das mit std::tr1::function im API und std::tr1::bind auf der Client-Seite eleganter lösen, aber die Kiste sieht mehr nach einer alten C-Bibliothek aus, die niemand mit der Kneifzange mehr anfassen will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2027659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2027659</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 28 Feb 2011 14:02:03 GMT</pubDate></item><item><title><![CDATA[Reply to Typedef in einer Klasse verwenden on Mon, 28 Feb 2011 14:30:51 GMT]]></title><description><![CDATA[<p>Danke an beide.</p>
<p>seldon dein Tipp bzw dein Code hat es gerettet. Es stimmt, der letzte Parameter kann dazu genutzt werden um das Objekt selbst mit an den Handler zu übergeben.<br />
Also es funktioniert jetzt wie folgt:</p>
<pre><code class="language-cpp">//Im Code:
openContext.onSoftbuttonsChanged.softbuttonsChangedCallback = myFuncButtonCallback;
	openContext.onSoftbuttonsChanged.softbuttonsChangedContext = this;

//Wo anders:

DWORD WINAPI myCallback(IN int device, IN DWORD dwButtons, IN const PVOID pContext)
{
	CLCDMain *self = reinterpret_cast&lt;CLCDMain*&gt;(pContext);
	return self-&gt;buttonCallback(device, dwButtons);
} 

DWORD WINAPI CLCDMain::buttonCallback(IN int device, IN DWORD dwButtons)
{
	switch(dwButtons)
	{
	case 1:
		printf(&quot;Button 1 Pressed\n&quot;);
		break;
	case 2:
		printf(&quot;Button 2 Pressed\n&quot;);
		break;
	case 4:
		printf(&quot;Button 3 Pressed\n&quot;);
		break;
	case 8:
		printf(&quot;Button 4 Pressed\n&quot;);
		break;
	default:
		printf(&quot;Button Released\n&quot;);
	}
	return 1;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2027674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2027674</guid><dc:creator><![CDATA[Hu5eL]]></dc:creator><pubDate>Mon, 28 Feb 2011 14:30:51 GMT</pubDate></item></channel></rss>