IGraphBuilder, IMediaControl ...



  • Hi,

    ich habe mir einen kleinen MediaPlayer mit Hilfe von IGraphBuilder, IMediaControl und so weiter gebaut.

    Immer wenn ein neues Lied / Video abgespielt wird gebe ich alle Ressourcen frei (Release()) und erstelle diese neu:

    CleanUp:

    if (m_pMediaControl != NULL)
    	{
    		m_pMediaControl->Stop();
    		m_pMediaControl->Release();
    		m_pMediaControl = NULL;
    	}
    	if (m_pVideoWin != NULL)
    	{
    		m_pVideoWin->put_Visible(OAFALSE);
    		m_pVideoWin->put_Owner(NULL);
    		m_pVideoWin->Release();
    		m_pVideoWin = NULL;
    	}
    	if (m_pMediaPosition != NULL)
    	{
    		m_pMediaPosition->Release();
    		m_pMediaPosition = NULL;
    	}
    	if (m_pGraph != NULL)
    	{
    		m_pGraph->Release();
    		m_pGraph = NULL;
    	}
    

    Neu Erstellen:

    CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&m_pGraph);
    
    	m_pGraph->QueryInterface(IID_IMediaControl, (void**)&m_pMediaControl);
    	m_pGraph->QueryInterface(IID_IMediaPosition, (void**)&m_pMediaPosition);
    
    	// If Video File init the IVideoWindow Interface
    	if (m_CurrentFile->GetType() == MEDIAFILE_VIDEO)
    	{
    		m_pGraph->QueryInterface(IID_IVideoWindow, (void**)&m_pVideoWin);
    	}
    
    ...
    

    Das klappt so weit auch alles...
    Aber muss ich diese wirklich immer löschen und neu erstellen?

    Ich frage deshalb weil es zu einem Fehler beim Zeichnen kommt:
    Meine App sendet auch immer wieder WM_TIMER Events um einen ClientBereich zu aktualisieren.
    Hier tritt nach einiger Zeit der Fehler auf das alles was von mir auf den HDC gezeichnet wird (DrawText, FillRect, … also nicht die Windows Buttons) weiß gezeichnet wird.

    Ich habe versucht das ganze einzugrenzen und es muss irgendwie mit dem MediaPlayer Teil zusammen hängen... hatte jemand schon was ähnliches? (Ich weiß das es schwer ist ohne Quellcode hier ein Aussage zu treffe, der Quellcode ist aber denk ich zu viel).
    Oder weiß jemand woran das liegen kann?

    Solange ich keine Media Dateien abspiele läuft das Programm ohne Probleme durch und es wird richtig gezeichnet.

    Bin für jeden Tipp dankbar!!! 😉



  • Ich hab das Problem immer noch nicht gefunden...

    Dafür hab ich jetzt mehr Infos und eine Fehlermeldung:

    Insufficient memory to create the bitmap. Close one or more applications to increase available memory.

    Diese Fehlermeldung bekomm ich von Windows XP wenn ich von der App einen Screenshot machen will (und das Window schon falsch gezeichnet wird). Unter Vista hab ich das gleiche Problem, da kamm die Fehlermeldung aber nicht.

    Außerderm kommmt der Fehler doch nicht von den MediaControls...

    Ich hab ja fast die Vermutung das in meiner WM_PAINT Methode was falsch läuft.
    Lösch ich etwas nicht richtig?

    void CAppWindow::OnPaint(HDC hDC)
    {
    	CTheme *theme = (*m_Config)->GetTheme();
    	RECT	r;
    	GetClientRect(m_hWnd, &r);
    
    	HDC hdcTemp = ::CreateCompatibleDC(hDC);
    	HBITMAP	hBitmap = ::CreateBitmap(r.right, r.bottom,1,32,NULL);
    
    	::SelectObject(hdcTemp, hBitmap);
    
    	::FillRect (hdcTemp, &r, CreateSolidBrush(RGB(
    		theme->GetPropertyInt("background.color", "r"),
    		theme->GetPropertyInt("background.color", "g"),
    		theme->GetPropertyInt("background.color", "b"))));
    
    	Gdiplus::Graphics graphics(hdcTemp);
    
    	OnPaint(hdcTemp, &graphics, theme);
    
    	::BitBlt(hDC, 0, 0, r.right, r.bottom, hdcTemp, 0,0, SRCCOPY );
    	::DeleteObject(hBitmap);
    	::DeleteDC(hdcTemp);
    }
    

    Bin für jeden Tipp Dankbar... ich find den Fehler irgendwie nicht... 🙄



  • Man, habs endlich gefunden!!!

    ::FillRect (hdcTemp, &r, CreateSolidBrush(RGB(
            theme->GetPropertyInt("background.color", "r"),
            theme->GetPropertyInt("background.color", "g"),
            theme->GetPropertyInt("background.color", "b"))));
    

    Das mit CreateSolidBrush erzeugte Handle wurde nicht mehr gelöscht... 🤡


Anmelden zum Antworten