<?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-Funktion eines Clients aus COM DLL heraus aufrufen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich möchte gern aus einer COM-DLL heraus eine Callback-Funktion eines Clients aufrufen. Der Aufruf soll aus einer in der DLL implemenierten Klasse heraus erfolgen. Mir fehlt da aber irgendwo der richtige Input an Wissen. Meine beiden Hauptprobleme sind:</p>
<p>1. Wie übergebe ich den Funktions-Zeiger aus dem Client an die COM-DLL? (Interface-Definition?)<br />
2. Wie binde ich diesen Funktionszeiger in der DLL-internen Klasse dann ein, damit ich darüber die Callback-Funktion des Clients aufrufen kann?</p>
<p>Ich arbeite unter Visual Studio 2005 (VC++). Die Callback-Funktion des Clients hat folgendes Aussehen:</p>
<p>void CKlasse::Callback(LPVOID pContext, TMyStruct* pMsg);<br />
(TMyStruct ist dabei allerdings in der DLL definiert)</p>
<p>Hat jemand einen Tipp, eine Website oder eine Buchempfehlung, wo soetwas abgehandelt wird? Oder kennt sich jemand damit soweit aus, um hier eine kurze Beschreibung posten zu können?</p>
<p>Für jegliche Hilfe schon im Voraus vielen Dank!<br />
Wes</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/187165/callback-funktion-eines-clients-aus-com-dll-heraus-aufrufen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 01 Jul 2026 21:16:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/187165.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 16 Jul 2007 14:59:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Callback-Funktion eines Clients aus COM DLL heraus aufrufen on Mon, 16 Jul 2007 15:37:16 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich möchte gern aus einer COM-DLL heraus eine Callback-Funktion eines Clients aufrufen. Der Aufruf soll aus einer in der DLL implemenierten Klasse heraus erfolgen. Mir fehlt da aber irgendwo der richtige Input an Wissen. Meine beiden Hauptprobleme sind:</p>
<p>1. Wie übergebe ich den Funktions-Zeiger aus dem Client an die COM-DLL? (Interface-Definition?)<br />
2. Wie binde ich diesen Funktionszeiger in der DLL-internen Klasse dann ein, damit ich darüber die Callback-Funktion des Clients aufrufen kann?</p>
<p>Ich arbeite unter Visual Studio 2005 (VC++). Die Callback-Funktion des Clients hat folgendes Aussehen:</p>
<p>void CKlasse::Callback(LPVOID pContext, TMyStruct* pMsg);<br />
(TMyStruct ist dabei allerdings in der DLL definiert)</p>
<p>Hat jemand einen Tipp, eine Website oder eine Buchempfehlung, wo soetwas abgehandelt wird? Oder kennt sich jemand damit soweit aus, um hier eine kurze Beschreibung posten zu können?</p>
<p>Für jegliche Hilfe schon im Voraus vielen Dank!<br />
Wes</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326652</guid><dc:creator><![CDATA[Wesley67]]></dc:creator><pubDate>Mon, 16 Jul 2007 15:37:16 GMT</pubDate></item><item><title><![CDATA[Reply to Callback-Funktion eines Clients aus COM DLL heraus aufrufen on Mon, 16 Jul 2007 15:39:07 GMT]]></title><description><![CDATA[<p>Callbacks macht man in COM über &quot;outgoing&quot; Interfaces.<br />
Entweder du implementierst IConnectionPoint oder du strickst dir was eigenes.</p>
<p>Das Grundprinzip ist auf jeden Fall immer dass du dem COM Objekt ein Interface mitgibst, also z.B.:</p>
<pre><code>interface XYZ ...
{
...
    HRESULT SetCallback([in] IMyCallBackInterface* p);
};
</code></pre>
<p>Im Falle von IConnectionPoint heisst die &quot;SetCallback&quot; Funktion dann eben Advise und liefert über ein output Parameter noch ein Cookie zurück welches die &quot;connection&quot; identifiziert. Was der eher lästige Teil bei IConnectionPoint ist ist die Implementierung von IConnectionPointContainer.<br />
Du kannst dir aber zum Testen mal ein Projekt mit attributed COM machen, dort dann einfach __event verwenden, und gucken was der Compiler für Code generiert.<br />
Ich denke sogar es sollte da in der ATL bereits irgendwelche Klassen geben die einem den Grossteil der Arbeit abnehmen.</p>
<p>Falls du es mit Hand machen willst: die SetCallback von oben müsste dann einfach nur ein AddRef auf das übergebene Interface machen, und den Pointer irgendwo ablegen.<br />
Falls dein COM Objekt single threaded ist und du aus einem Thread heraus Events verschicken willst musst du den Zeiger allerdings erstmal in diesen Thread rübermarschallen. Das gilt zwar grundsätzlich immer wenn ein Interface-Zeiger zwischen zwei Apartments übergeben wird, ich erwähne es nur falls du mit sowas noch nie zu tun hattest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326676</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 16 Jul 2007 15:39:07 GMT</pubDate></item><item><title><![CDATA[Reply to Callback-Funktion eines Clients aus COM DLL heraus aufrufen on Mon, 16 Jul 2007 16:12:52 GMT]]></title><description><![CDATA[<p>Also der Hinweis mit IConnectionPoint ist schon mal ein guter Tipp. Dem werde ich nachgehen.<br />
Und nein, mein COM-Objekt arbeitet mit einem weiteren von ihm gestarteten &quot;Horch&quot;-Thread, aus dem heraus dann auch die Callback-Funktion aufgerufen werden soll.</p>
<p>Werd mich jetzt erst mal in den ersten Tipp reinwühlen und melde mich dann ggf. nochmal falls die Probs zu arg werden.</p>
<p>Besten Dank erst einmal,<br />
Wes</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326701</guid><dc:creator><![CDATA[Wesley67]]></dc:creator><pubDate>Mon, 16 Jul 2007 16:12:52 GMT</pubDate></item><item><title><![CDATA[Reply to Callback-Funktion eines Clients aus COM DLL heraus aufrufen on Mon, 16 Jul 2007 21:15:23 GMT]]></title><description><![CDATA[<blockquote>
<p>Und nein, mein COM-Objekt arbeitet mit einem weiteren von ihm gestarteten &quot;Horch&quot;-Thread, aus dem heraus dann auch die Callback-Funktion aufgerufen werden soll.</p>
</blockquote>
<p>Wie, nein? Genau das meine ich ja, ein eigener Thread der die Events erzeugt.<br />
In dem Fall musst du das Interface &quot;marshallen&quot;, es sei denn das COM Objekt verwendet das MTA Modell (&quot;multithreaded apartment&quot;), dann erledigt das COM Subsystem ggf. das nötige Marshalling für dich.</p>
<p>Verwendet das COM Objekt allerdings das &quot;STA&quot; Modell (&quot;singlethreaded apartment&quot;) darfst du auch outgoing Interfaces (also das was du vom Client bekommst) nur von dem Thread aus verwenden mit dem dein COM Objekt angelegt wurde, also eben nicht vom &quot;Event Thread&quot; aus.<br />
Die IMHO einfachste Lösung in so einem Fall ist das Interface über den GIT zu marshallen: <a href="http://msdn2.microsoft.com/en-us/library/ms693781.aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/ms693781.aspx</a><br />
Ansonsten kannst du CoMarshalInterThreadInterfaceInStream verwenden: <a href="http://msdn2.microsoft.com/en-us/library/ms693316.aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/ms693316.aspx</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326830</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 16 Jul 2007 21:15:23 GMT</pubDate></item><item><title><![CDATA[Reply to Callback-Funktion eines Clients aus COM DLL heraus aufrufen on Mon, 16 Jul 2007 23:27:45 GMT]]></title><description><![CDATA[<p>Ja, richtig - hatte es erst anders verstanden. Momentan bin ich noch am herumexperimentieren, um herauszufinden, welche Konfigurationseinstellungen für das gesamte Konstrukt nun am günstigsten sind - bin dahingehend also noch an nix gebunden. Wenn ich das recht verstehe, wäre hier also das MTA-Modell sicher ratsamer.</p>
<p>Daneben habe ich noch eine Frage am Rande. Mehrere Prozesse werden jeweils gleichzeitig einzelne Instanzen des COM-Objektes nutzen. Allerdings werden dabei auch shared Variablen benötigt, die von allen Instanzen (nur intern) gleichermaßen genutzt werden. Ist das auch einfach mit #pragma data_seg zu realisieren oder sind da bei COM-DLLs noch andere Besonderheiten zu beachten?</p>
<p>Danke für die Mühe,<br />
Wes</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326868</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326868</guid><dc:creator><![CDATA[Wesley67]]></dc:creator><pubDate>Mon, 16 Jul 2007 23:27:45 GMT</pubDate></item><item><title><![CDATA[Reply to Callback-Funktion eines Clients aus COM DLL heraus aufrufen on Tue, 17 Jul 2007 01:31:29 GMT]]></title><description><![CDATA[<p>Ich kann nicht sagen dass sonst nixmehr zu beachten wäre, denn ich weiss es einfach nicht, aber ich schätze es müsste funktionieren.</p>
<p>Allerdings wäre es wohl einfacher das ganze als COM Server (.exe statt .dll eben) zu realisieren, dann brauchst du auch kein shared data Segment.<br />
Der grosse Nachteil von COM Servern ist allerdings dass die Aufrufe viel viel länger dauern. Wenn du so mit max. 1000 Calls pro Sekunde rechnest sollte es auf heutigen Rechnern egal sein. Wenn du mit deutlich mehr rechnest scheidet der COM Server wohl aus, bzw. würde u.U. einiges an Overhead erzeugen. Hier hilft natürlich ausprobieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Nochwas: probier auf jeden Fall auch die Client Seite aus bevor du dich für ein MTA entscheidest.<br />
Ich weiss nurmehr dass es Probleme gibt wenn der GUI Thread in einem MTA ist und man ActiveX GUI Komponenten verwenden will - das geht dann nämlich nicht.<br />
Also steckt man den GUI Thread wohl oder übel in ein STA. Dass deine Komponente dabei MTA ist *sollte* egal sein, aber ausprobieren würde ich es trotzdem.</p>
<p>Bei Verwendung eines COM Servers weiss ich dass es egal ist, das habe ich selbst so im Einsatz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326882</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 17 Jul 2007 01:31:29 GMT</pubDate></item><item><title><![CDATA[Reply to Callback-Funktion eines Clients aus COM DLL heraus aufrufen on Tue, 17 Jul 2007 09:50:32 GMT]]></title><description><![CDATA[<p>Also diese Probleme gibt es ja nicht nur bei COM, sondern in fast jeder MT-Anwendung. Aber zum Glück brauche ich mir um das GUI bei der Lösung keine Gedanken machen, denn das COM-Objekt hat bzw. braucht keins.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327071</guid><dc:creator><![CDATA[Wesley67]]></dc:creator><pubDate>Tue, 17 Jul 2007 09:50:32 GMT</pubDate></item><item><title><![CDATA[Reply to Callback-Funktion eines Clients aus COM DLL heraus aufrufen on Tue, 17 Jul 2007 15:45:47 GMT]]></title><description><![CDATA[<p>Welche Probleme gibt es nicht nur bei COM?<br />
Ich rede hier die ganze Zeit von Apartment Threading Dingens... das gibts ganz sicher nur bei COM.<br />
Hm...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327335</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 17 Jul 2007 15:45:47 GMT</pubDate></item><item><title><![CDATA[Reply to Callback-Funktion eines Clients aus COM DLL heraus aufrufen on Tue, 17 Jul 2007 21:03:23 GMT]]></title><description><![CDATA[<p>Also ich finde COM wunderbar!<br />
Ich versuche schon aus jedem popeligen Objekt ein interface irgendwie<br />
zu extrahieren, einen GUID attribut hinzuzufügen, (IDL lass ich oft weg),<br />
und das alles nur wegen dem kleinen Bild oben links(nur mit __interface möglich).</p>
<p>Und die wunderbare Terminologie: InProc, OutProc, STA, MTA, ...<br />
Und ganz toll sind die Enum interfaces und nätürlich immer wieder einmal<br />
aus langeweile einen RPC mechanismus zu schreiben, der vollkomment transparent<br />
arbeitet, Wundebar!!</p>
<p>(Das ist wirklich ernst gemeint)</p>
<pre><code class="language-cpp">__interface IUseless : IUnknown
{
    STDMETHOD(DatIsDoll)(ULONG* pulPar1, REFIID riid);
};

class UselessObject : public IUseless
{
public:
    UselessObject();
    ~UselessObject();
public:
    // IUnknown
    DECL_UNK
    // IUseless
    STDMETHOD(DatIsDoll)(ULONG* pulPar1, REFIID riid);
private:
    ULONG m_Ref;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1327448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327448</guid><dc:creator><![CDATA[Dennis123]]></dc:creator><pubDate>Tue, 17 Jul 2007 21:03:23 GMT</pubDate></item></channel></rss>