<?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 in DLLs]]></title><description><![CDATA[<p>Ich versuche gerade für eine Sprache, die COM nicht unterstützt, eine DLL zu schreiben, mit der es möglich ist, DVDs abzuspielen. Hier ist der Codeausschnitt, in dem ein Fehler auftritt:</p>
<pre><code class="language-cpp">// DvdGraphBuilder
hResult = CoCreateInstance(
	CLSID_DvdGraphBuilder,
	0, CLSCTX_INPROC_SERVER,
	IID_IDvdGraphBuilder,
	reinterpret_cast&lt; void** &gt;( &amp;g_pDvdGraphBuilder ) );

if( hResult ) return 0;

// GraphBuilder
hResult = g_pDvdGraphBuilder-&gt;GetFiltergraph( &amp;g_pGraphBuilder );

if( hResult ) return 0;

// MediaEvent
hResult = g_pGraphBuilder-&gt;QueryInterface(
	IID_IMediaEventEx,
	reinterpret_cast&lt; void** &gt;( &amp;g_pMediaEvent ) );

if( hResult ) return 0;

// MediaControl
hResult = g_pGraphBuilder-&gt;QueryInterface( 
	IID_IMediaControl, 
	reinterpret_cast&lt; void** &gt;( &amp;g_pMediaControl ) );

if( hResult ) return 0;

// VideoWindow
hResult = g_pGraphBuilder-&gt;QueryInterface( 
	IID_IVideoWindow, 
	reinterpret_cast&lt; void** &gt;( &amp;g_pVideoWindow ) );

if( hResult ) return 0;

// Render Status
AM_DVD_RENDERSTATUS status;
hResult = g_pDvdGraphBuilder-&gt;RenderDvdVideoVolume(
	0, AM_DVD_HWDEC_PREFER,
	&amp;status );

if( hResult ) return 0;

// DvdInfo
hResult = g_pDvdGraphBuilder-&gt;GetDvdInterface( 
	IID_IDvdInfo2,
	reinterpret_cast&lt; void** &gt;( &amp;g_pDvdInfo ) );

if( hResult ) return 0;

// DvdControl
hResult = g_pDvdGraphBuilder-&gt;GetDvdInterface( 
	IID_IDvdControl2, 
	reinterpret_cast&lt; void** &gt;( &amp;g_pDvdControl ) );

if( hResult ) return 0;
</code></pre>
<p>Es funktioniert alles so lange, bis &quot;RenderDvdVideoVolume&quot; in Zeile 38 aufgerufen wird. Dann stürtzt das Programm, das die DLL verwendet lautlos ab. Ich hab versucht, das ganze in einem kurzen C++ Programm zu verpacken und dann funktioniert es auch. Das Problem muss also bei der DLL liegen. Gibt es das in Sachen COM + DLLs irgendetwas, das ich übersehen hab?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/201602/com-in-dlls</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Apr 2026 10:56:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/201602.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 01 Jan 2008 23:19:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to COM in DLLs on Tue, 01 Jan 2008 23:19:01 GMT]]></title><description><![CDATA[<p>Ich versuche gerade für eine Sprache, die COM nicht unterstützt, eine DLL zu schreiben, mit der es möglich ist, DVDs abzuspielen. Hier ist der Codeausschnitt, in dem ein Fehler auftritt:</p>
<pre><code class="language-cpp">// DvdGraphBuilder
hResult = CoCreateInstance(
	CLSID_DvdGraphBuilder,
	0, CLSCTX_INPROC_SERVER,
	IID_IDvdGraphBuilder,
	reinterpret_cast&lt; void** &gt;( &amp;g_pDvdGraphBuilder ) );

if( hResult ) return 0;

// GraphBuilder
hResult = g_pDvdGraphBuilder-&gt;GetFiltergraph( &amp;g_pGraphBuilder );

if( hResult ) return 0;

// MediaEvent
hResult = g_pGraphBuilder-&gt;QueryInterface(
	IID_IMediaEventEx,
	reinterpret_cast&lt; void** &gt;( &amp;g_pMediaEvent ) );

if( hResult ) return 0;

// MediaControl
hResult = g_pGraphBuilder-&gt;QueryInterface( 
	IID_IMediaControl, 
	reinterpret_cast&lt; void** &gt;( &amp;g_pMediaControl ) );

if( hResult ) return 0;

// VideoWindow
hResult = g_pGraphBuilder-&gt;QueryInterface( 
	IID_IVideoWindow, 
	reinterpret_cast&lt; void** &gt;( &amp;g_pVideoWindow ) );

if( hResult ) return 0;

// Render Status
AM_DVD_RENDERSTATUS status;
hResult = g_pDvdGraphBuilder-&gt;RenderDvdVideoVolume(
	0, AM_DVD_HWDEC_PREFER,
	&amp;status );

if( hResult ) return 0;

// DvdInfo
hResult = g_pDvdGraphBuilder-&gt;GetDvdInterface( 
	IID_IDvdInfo2,
	reinterpret_cast&lt; void** &gt;( &amp;g_pDvdInfo ) );

if( hResult ) return 0;

// DvdControl
hResult = g_pDvdGraphBuilder-&gt;GetDvdInterface( 
	IID_IDvdControl2, 
	reinterpret_cast&lt; void** &gt;( &amp;g_pDvdControl ) );

if( hResult ) return 0;
</code></pre>
<p>Es funktioniert alles so lange, bis &quot;RenderDvdVideoVolume&quot; in Zeile 38 aufgerufen wird. Dann stürtzt das Programm, das die DLL verwendet lautlos ab. Ich hab versucht, das ganze in einem kurzen C++ Programm zu verpacken und dann funktioniert es auch. Das Problem muss also bei der DLL liegen. Gibt es das in Sachen COM + DLLs irgendetwas, das ich übersehen hab?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1429017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1429017</guid><dc:creator><![CDATA[ChristianK]]></dc:creator><pubDate>Tue, 01 Jan 2008 23:19:01 GMT</pubDate></item><item><title><![CDATA[Reply to COM in DLLs on Wed, 02 Jan 2008 07:21:35 GMT]]></title><description><![CDATA[<p>Das Problem in einer DLL ist eher, dass Du nicht weißt in welchem Thread-Kontext Deine Funktion aufgerufen wird und wann und wie COM initialisiert wurde.</p>
<p>Ansonsten gibt es keine Unterschiede zu Code aus einer EXE. Eine DLL ist auch nichts anderes als ein Stück Code Image wie eine EXE. Der größte Unterschied ist meistens, dass DLL's selterner eigene Threads haben oder Nachrichtenschleifen (was aber auch vorkommt).</p>
<p>Was sagt der Debugger?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1429079</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1429079</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 02 Jan 2008 07:21:35 GMT</pubDate></item><item><title><![CDATA[Reply to COM in DLLs on Wed, 02 Jan 2008 12:05:14 GMT]]></title><description><![CDATA[<blockquote>
<p>Was sagt der Debugger?</p>
</blockquote>
<p>Ich habe gerade versucht es zu debuggen und ahne jetzt, wo der Fehler liegt. Ich kann mein Programm nämlich gar nicht debuggen. Es kommt eine Sicherheitmeldung von DirectShow, dass ich einen Debugger installiert hätte und die Anwendung neu starten soll. <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="🙄"
    /><br />
Danach hab ich die DLL in einer anderen Sprache getestet und dort funktioniert sie. Muss also am aufrufenden Programm und den Kopierschutz-Mechanismen von DirectShow liegen.</p>
<p>Jedefalls vielen Dank für Deine Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1429215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1429215</guid><dc:creator><![CDATA[ChristianK]]></dc:creator><pubDate>Wed, 02 Jan 2008 12:05:14 GMT</pubDate></item><item><title><![CDATA[Reply to COM in DLLs on Wed, 02 Jan 2008 15:21:05 GMT]]></title><description><![CDATA[<p>Die Debuggermeldung kommt sicher nicht von DirectShow. Ich tippe eher auf einen DS-Filter von Nero. Zum Test kannst Du ja mal das Verzeichnis &quot;C:\Program Files\Common Files\Ahead\DSFilter&quot; (bzw. &quot;C:\Programme\Gemeinsame Dateien\Ahead\DSFilter&quot;) umbenennen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1429388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1429388</guid><dc:creator><![CDATA[sri]]></dc:creator><pubDate>Wed, 02 Jan 2008 15:21:05 GMT</pubDate></item></channel></rss>