<?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[COM aggregation]]></title><description><![CDATA[<p>Hallo,<br />
ich habe ein Problem mit der Aggregation in COM.<br />
Wenn ich QueryInterface (unter C++) auf dem Objekt aufrufe, um es in die andere Klasse zu &quot;casten&quot; erhalte ich als HRESULT E_NOINTERFACE zurück.<br />
Das soweit zur Fehlerbeschreibung.<br />
Jetzt meine Versuche:<br />
Ich habe zwei COM Objekte in zwei verschiedenen <em>.tlbs (</em>.dlls). Das eine soll das andere aggregieren (wäre relativ wichtig für mich, dass dies implizit geht).<br />
Nun importiere ich die lib im library Teil der idl des zweiten COM-Objektes mittels</p>
<pre><code>importlib(&quot;another.tlb&quot;);
</code></pre>
<p>das scheint auch zu funktionieren, da alles einwandfrei kompiliert.<br />
anschließend sage ich der coclass, welche neu hinzu kommt in dieser entsprechenden idl, dass sie das andere Interface unterstützt mittels:</p>
<pre><code>coclass AnotherClass
{
[default] interface IAnotherClass;
		interface IFirstInterface;
}
</code></pre>
<p>das geht so weit auch noch, wie gesagt, es treten keine Compilerfehler auf.<br />
Das IFirstInterface sollte auch durch das Importieren der tlb &quot;another.tlb&quot; bekannt sein.<br />
In der Implementierung von AnotherClass (CAnotherClass) habe ich folgende Einträge hinzugefügt:</p>
<pre><code class="language-cpp">DECLARE_GET_CONTROLLING_UNKNOWN()
CComPtr&lt;IUnknown&gt; m_pInnerUnknown;
COM_INTERFACE_ENTRY_AGGREGATE( __uuidof( FirstClass ), m_pInnerUnknown.p )
// und in FinalConstruct:
m_pInnerUnknown.CoCreateInstance( __uuidof( FirstClass), GetControllingUnknown(), CLSCTX_INPROC_SERVER );
</code></pre>
<p>soweit so gut, in FinalConstruct wird auch das richtige Objekt erzeugt.<br />
Allerdings, wenn ich die ganze Konstruktion so laufen lasse, erhalte ich bei einer Zuweisung der Zeiger, oder einem QueryInterface-Aufruf das HRESULT E_NOINTERFACE zurück.<br />
Allerdings habe ich keine Ahnung, wieso, da ich dachte, dass eigentlich alles richtig implementiert ist.<br />
Kann mir jemand helfen, bzw weiß jemand, warum das Ganze fehl schlägt?<br />
thx so far</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/210451/com-aggregation</link><generator>RSS for Node</generator><lastBuildDate>Tue, 21 Apr 2026 23:32:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/210451.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 11 Apr 2008 08:18:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to COM aggregation on Fri, 11 Apr 2008 08:19:39 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe ein Problem mit der Aggregation in COM.<br />
Wenn ich QueryInterface (unter C++) auf dem Objekt aufrufe, um es in die andere Klasse zu &quot;casten&quot; erhalte ich als HRESULT E_NOINTERFACE zurück.<br />
Das soweit zur Fehlerbeschreibung.<br />
Jetzt meine Versuche:<br />
Ich habe zwei COM Objekte in zwei verschiedenen <em>.tlbs (</em>.dlls). Das eine soll das andere aggregieren (wäre relativ wichtig für mich, dass dies implizit geht).<br />
Nun importiere ich die lib im library Teil der idl des zweiten COM-Objektes mittels</p>
<pre><code>importlib(&quot;another.tlb&quot;);
</code></pre>
<p>das scheint auch zu funktionieren, da alles einwandfrei kompiliert.<br />
anschließend sage ich der coclass, welche neu hinzu kommt in dieser entsprechenden idl, dass sie das andere Interface unterstützt mittels:</p>
<pre><code>coclass AnotherClass
{
[default] interface IAnotherClass;
		interface IFirstInterface;
}
</code></pre>
<p>das geht so weit auch noch, wie gesagt, es treten keine Compilerfehler auf.<br />
Das IFirstInterface sollte auch durch das Importieren der tlb &quot;another.tlb&quot; bekannt sein.<br />
In der Implementierung von AnotherClass (CAnotherClass) habe ich folgende Einträge hinzugefügt:</p>
<pre><code class="language-cpp">DECLARE_GET_CONTROLLING_UNKNOWN()
CComPtr&lt;IUnknown&gt; m_pInnerUnknown;
COM_INTERFACE_ENTRY_AGGREGATE( __uuidof( FirstClass ), m_pInnerUnknown.p )
// und in FinalConstruct:
m_pInnerUnknown.CoCreateInstance( __uuidof( FirstClass), GetControllingUnknown(), CLSCTX_INPROC_SERVER );
</code></pre>
<p>soweit so gut, in FinalConstruct wird auch das richtige Objekt erzeugt.<br />
Allerdings, wenn ich die ganze Konstruktion so laufen lasse, erhalte ich bei einer Zuweisung der Zeiger, oder einem QueryInterface-Aufruf das HRESULT E_NOINTERFACE zurück.<br />
Allerdings habe ich keine Ahnung, wieso, da ich dachte, dass eigentlich alles richtig implementiert ist.<br />
Kann mir jemand helfen, bzw weiß jemand, warum das Ganze fehl schlägt?<br />
thx so far</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1490163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1490163</guid><dc:creator><![CDATA[Vorden]]></dc:creator><pubDate>Fri, 11 Apr 2008 08:19:39 GMT</pubDate></item><item><title><![CDATA[Reply to COM aggregation on Fri, 11 Apr 2008 09:45:52 GMT]]></title><description><![CDATA[<p>erm, jo, war ein Problem, dass C# (in welchem ich es testweise benutzt habe) die Interops nicht nachgeneriert hat...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1490215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1490215</guid><dc:creator><![CDATA[Vorden]]></dc:creator><pubDate>Fri, 11 Apr 2008 09:45:52 GMT</pubDate></item></channel></rss>