<?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[Callback in C++]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich schreibe gerade an einer kleinen DLL die über einen Callback Mechanismus mit einer C# Anwendung kommunizieren soll. Dabei gehe ich so vor:</p>
<p>Von der C# Anwendung aus rufe ich folgende Funktion auf und übergebe die Adresse der aufzurufenden Funktion:</p>
<pre><code class="language-cpp">int SetCallback(void(*Callback)(int))
{
	return port.SetCallbackFunction(Callback);
}
</code></pre>
<p>port.SetCallbackFunction(Callback) macht folgendes:</p>
<pre><code class="language-cpp">int CANPort::SetCallbackFunction(void (*Callback)(int))
{
	this-&gt;CallbackFunction = Callback;
	return (int)Callback;
}
</code></pre>
<p>Den Funktionszeiger habe ich in der Klasse folgendermaßen deklariert:</p>
<pre><code class="language-cpp">void(*CallbackFunction)(int);
</code></pre>
<p>Den CallbackMechanismus möchte ich dann mit folgender Funktion durchführen:</p>
<pre><code class="language-cpp">if (this-&gt;CallbackFunction != NULL)
		(*CallbackFunction)(pRdObj-&gt;Channel+1);
</code></pre>
<p>Leider bekomme ich immer Zugriffsverletzungen. Die Adresse der C# Funktion übergebe ich folgendermaßen an die ganz oben genannte SetCallback Funktion in der C++ DLL:</p>
<pre><code class="language-csharp">IntPtr procCallbackAdr = GetProcAddress(m_dllHandle, &quot;SetCallback&quot;);
                SetCallbackDelegate setCallbackDel = (SetCallbackDelegate)Marshal.GetDelegateForFunctionPointer(procCallbackAdr, typeof(SetCallbackDelegate));
                CallbackFunctionDelegate internCallbackFunction = new CallbackFunctionDelegate(this.DriverCallbackFunction);

                IntPtr callbackPointer =Marshal.GetFunctionPointerForDelegate(internCallbackFunction);

                int rV = setCallbackDel(callbackPointer);
</code></pre>
<p>Ich bin mir ziemlich sicher das der Fehler irgendwo im C++ Code hängt und habe mich deshalb für das Forum hier entschieden.</p>
<p>Weiß jemand wo der Fehler liegt? Ich finde ihn einfach nicht, habe schon zig Quellen nach Callback Mechanismen durchsucht und komme leider auf keine Lösung.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/248066/callback-in-c</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 07:02:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/248066.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 19 Aug 2009 10:44:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Callback in C++ on Wed, 19 Aug 2009 10:44:38 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich schreibe gerade an einer kleinen DLL die über einen Callback Mechanismus mit einer C# Anwendung kommunizieren soll. Dabei gehe ich so vor:</p>
<p>Von der C# Anwendung aus rufe ich folgende Funktion auf und übergebe die Adresse der aufzurufenden Funktion:</p>
<pre><code class="language-cpp">int SetCallback(void(*Callback)(int))
{
	return port.SetCallbackFunction(Callback);
}
</code></pre>
<p>port.SetCallbackFunction(Callback) macht folgendes:</p>
<pre><code class="language-cpp">int CANPort::SetCallbackFunction(void (*Callback)(int))
{
	this-&gt;CallbackFunction = Callback;
	return (int)Callback;
}
</code></pre>
<p>Den Funktionszeiger habe ich in der Klasse folgendermaßen deklariert:</p>
<pre><code class="language-cpp">void(*CallbackFunction)(int);
</code></pre>
<p>Den CallbackMechanismus möchte ich dann mit folgender Funktion durchführen:</p>
<pre><code class="language-cpp">if (this-&gt;CallbackFunction != NULL)
		(*CallbackFunction)(pRdObj-&gt;Channel+1);
</code></pre>
<p>Leider bekomme ich immer Zugriffsverletzungen. Die Adresse der C# Funktion übergebe ich folgendermaßen an die ganz oben genannte SetCallback Funktion in der C++ DLL:</p>
<pre><code class="language-csharp">IntPtr procCallbackAdr = GetProcAddress(m_dllHandle, &quot;SetCallback&quot;);
                SetCallbackDelegate setCallbackDel = (SetCallbackDelegate)Marshal.GetDelegateForFunctionPointer(procCallbackAdr, typeof(SetCallbackDelegate));
                CallbackFunctionDelegate internCallbackFunction = new CallbackFunctionDelegate(this.DriverCallbackFunction);

                IntPtr callbackPointer =Marshal.GetFunctionPointerForDelegate(internCallbackFunction);

                int rV = setCallbackDel(callbackPointer);
</code></pre>
<p>Ich bin mir ziemlich sicher das der Fehler irgendwo im C++ Code hängt und habe mich deshalb für das Forum hier entschieden.</p>
<p>Weiß jemand wo der Fehler liegt? Ich finde ihn einfach nicht, habe schon zig Quellen nach Callback Mechanismen durchsucht und komme leider auf keine Lösung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1763351</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1763351</guid><dc:creator><![CDATA[Defqon]]></dc:creator><pubDate>Wed, 19 Aug 2009 10:44:38 GMT</pubDate></item><item><title><![CDATA[Reply to Callback in C++ on Wed, 19 Aug 2009 11:50:58 GMT]]></title><description><![CDATA[<p>Dein C#-Code sagt mir leider nichts.<br />
Spontan fällt mir bloß ein, dass die calling convention vielleicht nicht stimmt. Sowas wie __cdecl oder __stdcall.</p>
<p>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1763419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1763419</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Wed, 19 Aug 2009 11:50:58 GMT</pubDate></item><item><title><![CDATA[Reply to Callback in C++ on Wed, 19 Aug 2009 11:58:08 GMT]]></title><description><![CDATA[<p>Wenn ich mir deinen C# Quellcode anschaue, dann habe ich eher das Gefühl, dass dieser das Problem ist. Wie kannst du so sicher sein, dass es am C++ Code liegen soll?<br />
Zum Beispiel habe ich seeeeeehr starke Zweifel, dass du als Callback eine nicht statische Memberfunktion angeben kannst. Auch deine Cast sind für mich zum Teil etwas verwirrend und ich habe so meine Zweifel, dass dort dies passiert, was du möchtest.</p>
<p>Woher hast du dieses Vorgehen? Selber zusammengedacht oder aus einem Tutorial? Such mal auf <a href="http://www.codeproject.com" rel="nofollow">www.codeproject.com</a>, dort gibt es sicher ein paar Erklärung, wie man solche Callbacks durchführt. Ansonsten würde ich eher mal im C# Forum nachfragen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1763427</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1763427</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 19 Aug 2009 11:58:08 GMT</pubDate></item><item><title><![CDATA[Reply to Callback in C++ on Wed, 19 Aug 2009 12:29:01 GMT]]></title><description><![CDATA[<p>Hier mal ein kleines Bsp:</p>
<p><strong>Edit</strong><br />
Anmerkung: Bei deinem Code scheint mir einiges schief, desshalb habe ich nicht den Code korrigiert, sondern eben dieses Bsp. gemacht.</p>
<p>DLL Code:</p>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;
#include &lt;windows.h&gt;
#include &lt;tchar.h&gt;

extern &quot;C&quot;
{
    typedef void (__stdcall *Callback)(int);

    Callback _callback = 0;

    void __stdcall SetCallback(Callback callback) 
    {
        OutputDebugString(_T(&quot;SetCallback(..)\r\n&quot;));

        _callback = callback;
    }

    void __stdcall TestCallback(int value)
    {
        OutputDebugString(_T(&quot;TestCallback(..)\r\n&quot;));

        if (0 != _callback)
        {
            _callback(value);
        }
    }
}
</code></pre>
<p>Zugehöriges *.def File um die Funktionen zu exportieren.<br />
(Kann natürlich auch anders exportiert werden)</p>
<pre><code class="language-cpp">LIBRARY	&quot;Lib&quot;
EXPORTS
	SetCallback
	TestCallback
</code></pre>
<p>C# Applikation:</p>
<pre><code class="language-csharp">using System;
using System.Runtime.InteropServices;

namespace App
{
	class Program
	{
		delegate void Callback(int value);

		[DllImport(@&quot;..\..\..\debug\Lib.dll&quot;)]
		static extern void SetCallback(Callback callback);

		[DllImport(@&quot;..\..\..\debug\Lib.dll&quot;)]
		static extern void TestCallback(int value);

		static void Main(string[] args)
		{
			Callback callback = new Callback(OnCallback);

			SetCallback(callback);

			TestCallback(12);

			SetCallback(null);
		}

		static void OnCallback(int value)
		{
			Console.WriteLine(&quot;OnCallback(..), value = &quot; + value);
		}
	}
}
</code></pre>
<p>Ich hoffe es hilft Dir weiter.<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1763448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1763448</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Wed, 19 Aug 2009 12:29:01 GMT</pubDate></item></channel></rss>