COM in DLLs
-
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:
// DvdGraphBuilder hResult = CoCreateInstance( CLSID_DvdGraphBuilder, 0, CLSCTX_INPROC_SERVER, IID_IDvdGraphBuilder, reinterpret_cast< void** >( &g_pDvdGraphBuilder ) ); if( hResult ) return 0; // GraphBuilder hResult = g_pDvdGraphBuilder->GetFiltergraph( &g_pGraphBuilder ); if( hResult ) return 0; // MediaEvent hResult = g_pGraphBuilder->QueryInterface( IID_IMediaEventEx, reinterpret_cast< void** >( &g_pMediaEvent ) ); if( hResult ) return 0; // MediaControl hResult = g_pGraphBuilder->QueryInterface( IID_IMediaControl, reinterpret_cast< void** >( &g_pMediaControl ) ); if( hResult ) return 0; // VideoWindow hResult = g_pGraphBuilder->QueryInterface( IID_IVideoWindow, reinterpret_cast< void** >( &g_pVideoWindow ) ); if( hResult ) return 0; // Render Status AM_DVD_RENDERSTATUS status; hResult = g_pDvdGraphBuilder->RenderDvdVideoVolume( 0, AM_DVD_HWDEC_PREFER, &status ); if( hResult ) return 0; // DvdInfo hResult = g_pDvdGraphBuilder->GetDvdInterface( IID_IDvdInfo2, reinterpret_cast< void** >( &g_pDvdInfo ) ); if( hResult ) return 0; // DvdControl hResult = g_pDvdGraphBuilder->GetDvdInterface( IID_IDvdControl2, reinterpret_cast< void** >( &g_pDvdControl ) ); if( hResult ) return 0;Es funktioniert alles so lange, bis "RenderDvdVideoVolume" 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?
-
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.
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).
Was sagt der Debugger?
-
Was sagt der Debugger?
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.

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.Jedefalls vielen Dank für Deine Hilfe.
-
Die Debuggermeldung kommt sicher nicht von DirectShow. Ich tippe eher auf einen DS-Filter von Nero. Zum Test kannst Du ja mal das Verzeichnis "C:\Program Files\Common Files\Ahead\DSFilter" (bzw. "C:\Programme\Gemeinsame Dateien\Ahead\DSFilter") umbenennen.