Media Foundation: другой способ вызова IMFActivate::ShutdownObject?

Вот вопрос о IMFActivate::ActivateObject и IMFActivate::ShutdownObject в Media Foundation.

Согласно MSDN, компонент, вызывающий ActivateObject, отвечает за вызов ShutdownObject.

Но есть два примера, не следующих этому правилу:

http://msdn.microsoft.com/en-us/library/dd388503%28VS.85%29.aspx

а также

http://msdn.microsoft.com/en-us/library/dd317912%28VS.85%29.aspx

В этих двух примерах они вызывают ActivateObject, а затем освобождают интерфейс IMFActivate без вызова метода ShutdownObject.

Это приведет к утечке памяти, верно? Или есть другой способ освободить ресурс, занятый объектом?

(Могу ли я использовать IMFMediaSource::Shutdown для освобождения объекта вместо использования IMFActivate::ShutdownObject)

Заранее спасибо.


person KenC    schedule 13.09.2009    source источник


Ответы (1)


Вы правы в том, что вы должны вызывать IMFActivate::ShutdownObject, когда закончите использовать активированный вами объект. Однако обратите внимание, что рассматриваемый образец создает экземпляр IMFMediaSource, который будет возвращен в параметре out.

HRESULT CreateVideoDeviceSource(IMFMediaSource **ppSource)

Если бы CreateVideoDeviceSource выполнял ShutdownObject для IMFMediaSource, который он создал, а затем возвращал его вам, он был бы в выключенном состоянии и, следовательно, вероятно, непригоден для использования.

Чтобы ответить на ваш вопрос о том, что вы должны с этим делать, вы, вероятно, можете уйти с pMyMediaSource->Shutdown() после того, как вы все сделали с ним.

Дополнительная информация: другое использование IMFActivate в Media Foundation — создание экземпляра объекта MF в другом процессе (полезно, потому что сеанс мультимедиа MF будет воспроизводить содержимое, защищенное DRM, в отдельном процессе); в этом случае сеанс мультимедиа MF действительно вызовет IMFActivate::ShutdownObject для любых IMFActivates, которые вы ему предоставили.

person user357501    schedule 24.08.2010