none
Problem with DirectShow under WinCE RRS feed

  • Вопрос

  • Обращаюсь к специалистам Майкрософт, т.к. не смог найти ответ где-то ещё.

    Использую: MS Windows XP Pro SP2, MS Visual Studio 2005 (C++); установленные SDK: Microsoft DirectX SDK, Microsoft Platform SDK for Windows Server 2003 R2, Windows Mobile 5.0 Pocket PC SDK.

    Беру пример: \Microsoft Platform SDK for Windows Server 2003 R2\Samples\Multimedia\DirectShow\Filters\Async\

    Cобираю strmbasd.lib, затем memfile.exe под Win32 -- всё работает (проверял проигрывание mp3, avi (mpeg4)).

    Собираю этот же пример под Windows Mobile 5.0 Pocket PC (strmbase.lib не собираю, т.к. под WinCE BaseClasses в сорцах не идут, идёт сама библиотека)

    -- не работает. Падает на первом же вызове AddRef() у созданного фильтра, memfile.cpp:

    ...

    HRESULT hr = S_OK;

    hr = CoInitializeEx( NULL, COINIT_MULTITHREADED ); // COINIT_APARTMENTTHREADED

    CMemStream Stream( pbMem, (LONGLONG)uliSize.QuadPart, dwKBPerSec );

    CMemReader *rdr = new CMemReader(&Stream, &mt, &hr);

    if(FAILED(hr) || rdr == NULL){ <всех убить и выйти> }

    // Make sure we don't accidentally go away!

    rdr->AddRef(); // поломка, здесь в конечном итоге происходит попытка вызвать AddRef() у member-а m_pUnknown базового класса CUnknown, а этот m_pUnknown оказывается равным нулю.

    ...

    В реализации конструктора CUnknown (доступной только под Win32) указатель устанавливается в this, если входной параметр был NULL -- а именно он и передаётся в коде данного примера от Майкрософт.

     

    Если реализовать в классе CMemReader свои AddRef() и Release(), а затем подправить пример так, чтобы в конструктор CBaseFilter попадал указатель на себя, то, естественно, сразу не падает на rdr->AddRef(), но зато потом ломается где-то в недрах библиотеки DirectShow Sad

    Люди добрые, подскажите пожалуйста, возможно ли собрать данный пример на WinCE (например, под Windows Mobile 5.0 Pocket PC), и если возможно, то как?

    27 марта 2007 г. 5:49