<?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-Objekt mit benutzerdefiniertem Interface]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich weiß nicht, ob ich hier im WinAPI-Forum richtig bin, wenn nicht, verschiebt mein Posting bitte entsprechend.</p>
<p>Ich habe ein Problem mit dem Erstellen einer COM-Komponente, die ein benutzerdefiniertes (also von mir festgelegtes) Interface haben soll. Ich habe schon lange daran herumprobiert, kann den Fehler aber nicht finden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Konkret handelt es sich bei der Komponente um einen DirectShow-Filter. Für den Filter selber habe ich vorerst ein beim DirectX-SDK mitgeliefertes Beispiel (&quot;PushSource&quot;) genommen.</p>
<p>Nun zu meinem Problem: Um den Filter konfigurieren und bestimmte Daten übertragen zu können, möchte ich der COM-Komponente ein neues Interface hinzufügen. Ich habe ich das Interface wie folgt definiert und das Programm wird auch problemlos kompiliert.</p>
<pre><code>import &quot;oaidl.idl&quot;;
import &quot;ocidl.idl&quot;;

[
    uuid( ... ),
    version(1.0),
    helpstring(&quot;Img2VidFilter&quot;)
]
library Img2VidFilter
{
     importlib(&quot;stdole32.tlb&quot;);
     importlib(&quot;stdole2.tlb&quot;);
     [
          object,
          uuid( ... ),
          helpstring(&quot;IImg2VidFilter Interface&quot;),
          pointer_default(unique)
     ]
     interface IImg2VidFilter : IUnknown
     {
          HRESULT Test(void);
     };
};
</code></pre>
<p>Die Klassendefinition sieht wie folgt aus:</p>
<pre><code class="language-cpp">class CImg2VidFilter : public CSource, IImg2VidFilter
{
public:
	DECLARE_IUNKNOWN;

	STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv)
	{
		if (riid == IID_IImg2VidFilter)
			return GetInterface(reinterpret_cast&lt;IImg2VidFilter*&gt;(this), ppv);
		else
			return CSource::NonDelegatingQueryInterface(riid, ppv);
	}

	static CUnknown * WINAPI CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr);

	// IImg2VidFilter-Methoden
	STDMETHODIMP Test(void); //HRESULT Test(void);

private:
	CImg2VidFilter(IUnknown *pUnk, HRESULT *phr);
	~CImg2VidFilter();

	COutputPin *m_pPin;
};
</code></pre>
<p>Die Implementierung der Methode:</p>
<pre><code class="language-cpp">STDMETHODIMP CImg2VidFilter::Test(void)
{
	return 0;
}
</code></pre>
<p>Zum Schluss noch das Testprogramm:</p>
<pre><code class="language-cpp">...
#include &quot;customInterfaces_h.h&quot;    //vom Compiler mithilfe der idl-Datei erstellt
DEFINE_GUID(CLSID_Img2VidFilter, ... );
...
IBaseFilter *pFilter = 0;
IImg2VidFilter *pCustomInterface = 0;
HRESULT hRes;

hRes = CoCreateInstance(CLSID_Img2VidFilter, 0, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, reinterpret_cast&lt;LPVOID*&gt;(&amp;pFilter));
if (FAILED(hRes))
   throw &quot;error&quot;;

hRes = pFilter-&gt;QueryInterface(IID_IImg2VidFilter,
(void**)&amp;pCustomInterface);
if (FAILED(hRes))
   throw &quot;error&quot;;

if (pCustomInterface == 0)
 throw &quot;error&quot;;
pCustomInterface-&gt;Test();   //hier stürzt das Programm ab (siehe unten)
pCustomInterface-&gt;Release();

pFilter-&gt;Release();
...
</code></pre>
<p>Leider stürzt das Testprogramm immer mit einer Fehlermeldung ab:</p>
<pre><code>Unbehandelte Ausnahme bei 0x01674acb (img2vidFilter.dll) in DShow-1.exe: 0xC0000005: Zugriffsverletzung-Schreibposition 0x0169721c.
</code></pre>
<p>Was mache ich falsch? Muss ich vielleicht noch irgendwelche Einstellungen in der IDE ändern (ich benutze VC++ .net 2003 Standard) oder weitere Dateien einbinden?</p>
<p>Sven</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/71410/com-objekt-mit-benutzerdefiniertem-interface</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Apr 2026 17:19:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/71410.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 18 Apr 2004 11:48:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to COM-Objekt mit benutzerdefiniertem Interface on Sun, 18 Apr 2004 11:48:45 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich weiß nicht, ob ich hier im WinAPI-Forum richtig bin, wenn nicht, verschiebt mein Posting bitte entsprechend.</p>
<p>Ich habe ein Problem mit dem Erstellen einer COM-Komponente, die ein benutzerdefiniertes (also von mir festgelegtes) Interface haben soll. Ich habe schon lange daran herumprobiert, kann den Fehler aber nicht finden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Konkret handelt es sich bei der Komponente um einen DirectShow-Filter. Für den Filter selber habe ich vorerst ein beim DirectX-SDK mitgeliefertes Beispiel (&quot;PushSource&quot;) genommen.</p>
<p>Nun zu meinem Problem: Um den Filter konfigurieren und bestimmte Daten übertragen zu können, möchte ich der COM-Komponente ein neues Interface hinzufügen. Ich habe ich das Interface wie folgt definiert und das Programm wird auch problemlos kompiliert.</p>
<pre><code>import &quot;oaidl.idl&quot;;
import &quot;ocidl.idl&quot;;

[
    uuid( ... ),
    version(1.0),
    helpstring(&quot;Img2VidFilter&quot;)
]
library Img2VidFilter
{
     importlib(&quot;stdole32.tlb&quot;);
     importlib(&quot;stdole2.tlb&quot;);
     [
          object,
          uuid( ... ),
          helpstring(&quot;IImg2VidFilter Interface&quot;),
          pointer_default(unique)
     ]
     interface IImg2VidFilter : IUnknown
     {
          HRESULT Test(void);
     };
};
</code></pre>
<p>Die Klassendefinition sieht wie folgt aus:</p>
<pre><code class="language-cpp">class CImg2VidFilter : public CSource, IImg2VidFilter
{
public:
	DECLARE_IUNKNOWN;

	STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv)
	{
		if (riid == IID_IImg2VidFilter)
			return GetInterface(reinterpret_cast&lt;IImg2VidFilter*&gt;(this), ppv);
		else
			return CSource::NonDelegatingQueryInterface(riid, ppv);
	}

	static CUnknown * WINAPI CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr);

	// IImg2VidFilter-Methoden
	STDMETHODIMP Test(void); //HRESULT Test(void);

private:
	CImg2VidFilter(IUnknown *pUnk, HRESULT *phr);
	~CImg2VidFilter();

	COutputPin *m_pPin;
};
</code></pre>
<p>Die Implementierung der Methode:</p>
<pre><code class="language-cpp">STDMETHODIMP CImg2VidFilter::Test(void)
{
	return 0;
}
</code></pre>
<p>Zum Schluss noch das Testprogramm:</p>
<pre><code class="language-cpp">...
#include &quot;customInterfaces_h.h&quot;    //vom Compiler mithilfe der idl-Datei erstellt
DEFINE_GUID(CLSID_Img2VidFilter, ... );
...
IBaseFilter *pFilter = 0;
IImg2VidFilter *pCustomInterface = 0;
HRESULT hRes;

hRes = CoCreateInstance(CLSID_Img2VidFilter, 0, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, reinterpret_cast&lt;LPVOID*&gt;(&amp;pFilter));
if (FAILED(hRes))
   throw &quot;error&quot;;

hRes = pFilter-&gt;QueryInterface(IID_IImg2VidFilter,
(void**)&amp;pCustomInterface);
if (FAILED(hRes))
   throw &quot;error&quot;;

if (pCustomInterface == 0)
 throw &quot;error&quot;;
pCustomInterface-&gt;Test();   //hier stürzt das Programm ab (siehe unten)
pCustomInterface-&gt;Release();

pFilter-&gt;Release();
...
</code></pre>
<p>Leider stürzt das Testprogramm immer mit einer Fehlermeldung ab:</p>
<pre><code>Unbehandelte Ausnahme bei 0x01674acb (img2vidFilter.dll) in DShow-1.exe: 0xC0000005: Zugriffsverletzung-Schreibposition 0x0169721c.
</code></pre>
<p>Was mache ich falsch? Muss ich vielleicht noch irgendwelche Einstellungen in der IDE ändern (ich benutze VC++ .net 2003 Standard) oder weitere Dateien einbinden?</p>
<p>Sven</p>
]]></description><link>https://www.c-plusplus.net/forum/post/503652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/503652</guid><dc:creator><![CDATA[Sven25]]></dc:creator><pubDate>Sun, 18 Apr 2004 11:48:45 GMT</pubDate></item><item><title><![CDATA[Reply to COM-Objekt mit benutzerdefiniertem Interface on Sun, 18 Apr 2004 14:49:41 GMT]]></title><description><![CDATA[<p>Wo genau kommt denn der Fehler (Debugger)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/503747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/503747</guid><dc:creator><![CDATA[flenders]]></dc:creator><pubDate>Sun, 18 Apr 2004 14:49:41 GMT</pubDate></item><item><title><![CDATA[Reply to COM-Objekt mit benutzerdefiniertem Interface on Sun, 18 Apr 2004 15:05:46 GMT]]></title><description><![CDATA[<p>Ich bin jetzt nur schnell drübergeflogen, aber:</p>
<p>Sven25 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv)
	{
		if (riid == IID_IImg2VidFilter)
			return GetInterface(reinterpret_cast&lt;IImg2VidFilter*&gt;(this), ppv);
		else
			return CSource::NonDelegatingQueryInterface(riid, ppv);
	}
</code></pre>
</blockquote>
<p>Sollte das nicht static_cast anstelle von reinterpret_cast heissen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/503755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/503755</guid><dc:creator><![CDATA[-King-]]></dc:creator><pubDate>Sun, 18 Apr 2004 15:05:46 GMT</pubDate></item><item><title><![CDATA[Reply to COM-Objekt mit benutzerdefiniertem Interface on Sun, 18 Apr 2004 15:07:30 GMT]]></title><description><![CDATA[<p>flenders schrieb:</p>
<blockquote>
<p>Wo genau kommt denn der Fehler (Debugger)?</p>
</blockquote>
<p>Sven25 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">pCustomInterface-&gt;Test();   //hier stürzt das Programm ab (siehe unten)
pCustomInterface-&gt;Release();
</code></pre>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/503757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/503757</guid><dc:creator><![CDATA[-King-]]></dc:creator><pubDate>Sun, 18 Apr 2004 15:07:30 GMT</pubDate></item><item><title><![CDATA[Reply to COM-Objekt mit benutzerdefiniertem Interface on Sun, 18 Apr 2004 15:19:16 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>wie gesagt, er tritt in der Zeile</p>
<pre><code class="language-cpp">pCustomInterface-&gt;Test();
</code></pre>
<p>im Testprogramm auf. Kommentiere ich sie aus, stürzt das Programm nicht mehr ab.</p>
<p>Der Debugger spring, wenn ich bei der Fehlermeldung auf &quot;Unterbrechen&quot; drücke, in den Quelltext des Filters (also der COM-Komponente). Er geht dann automatisch zur Zeile, die den Destruktor enthält. An dem kann es aber kaum liegen, da der Absturz auch auftritt, wenn der Destruktor keine Befehle enthält.</p>
<p>Sven</p>
<p>(Edit:) -King- war schneller, ich wurde beim Tippen der Antwort kurz unterbrochen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/503766</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/503766</guid><dc:creator><![CDATA[Sven25]]></dc:creator><pubDate>Sun, 18 Apr 2004 15:19:16 GMT</pubDate></item><item><title><![CDATA[Reply to COM-Objekt mit benutzerdefiniertem Interface on Sun, 18 Apr 2004 15:27:57 GMT]]></title><description><![CDATA[<p>Irgendwie habe ich aber trotzdem noch den Eindruck, daß Du meinen ersten Beitrag nicht gelesen hast. Also nochmal: <strong>static_cast</strong>!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/503779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/503779</guid><dc:creator><![CDATA[-King-]]></dc:creator><pubDate>Sun, 18 Apr 2004 15:27:57 GMT</pubDate></item><item><title><![CDATA[Reply to COM-Objekt mit benutzerdefiniertem Interface on Sun, 18 Apr 2004 15:31:32 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>-King- schrieb:</p>
<blockquote>
<p>Irgendwie habe ich aber trotzdem noch den Eindruck, daß Du meinen ersten Beitrag nicht gelesen hast. Also nochmal: <strong>static_cast</strong>!</p>
</blockquote>
<p>Doch, -King-, ich habe ihn gelesen. Aber ich habe deinen Tipp bis gerade noch ausprobiert und war nun dabei, die Antwort zu schreiben.</p>
<p>-King- schrieb:</p>
<blockquote>
<p>Sven25 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv)
	{
		if (riid == IID_IImg2VidFilter)
			return GetInterface(reinterpret_cast&lt;IImg2VidFilter*&gt;(this), ppv);
		else
			return CSource::NonDelegatingQueryInterface(riid, ppv);
	}
</code></pre>
</blockquote>
<p>Sollte das nicht static_cast anstelle von reinterpret_cast heissen?</p>
</blockquote>
<p>Super, vielen Dank! Jetzt funktioniert es! <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>Sven</p>
]]></description><link>https://www.c-plusplus.net/forum/post/503782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/503782</guid><dc:creator><![CDATA[Sven25]]></dc:creator><pubDate>Sun, 18 Apr 2004 15:31:32 GMT</pubDate></item></channel></rss>