Udostępnij przez


Dystrybutory wtyczek

[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, IMFMediaEnginei Audio/Video Capture w Media Foundation. Te funkcje zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał MediaPlayer, IMFMediaEngine i Audio/Video Capture w programie Media Foundation zamiast DirectShow, jeśli to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]

Dystrybutory wtyczek (PID) to sposób rozszerzenia funkcjonalności menedżera grafów filtrów. Dystrybutor wtyczek jest obiektem COM, który menedżer grafów filtrów agreguje w czasie wykonywania. Aplikacje uzyskują dostęp do identyfikatora PID za pośrednictwem menedżera grafów filtrów.

Gdy menedżer wykresu filtru jest odpytywane dla interfejsu, który nie obsługuje, wyszukuje w rejestrze klucz o następującym formularzu:

HKEY_CLASSES_ROOT\Interface\IID\Distributor

IID to ciąg zawierający identyfikator interfejsu. Jeśli wpis rejestru istnieje, wartość wpisu definiuje identyfikator klasy (CLSID) identyfikatora PID, który obsługuje interfejs. Menedżer wykresu filtru agreguje identyfikator PID i zwraca wskaźnik interfejsu, działając w ten sposób jako zewnętrzny IUnknown dla identyfikatora PID. Gdy aplikacja wywołuje metody w interfejsie, faktycznie wywołuje je w identyfikatorze PID. Jednak istnienie identyfikatora PID jest niewidoczne dla aplikacji.

Termin dystrybutora wynika z faktu, że piD może odpytować jego zewnętrzne IUnknown wskaźnik interfejsów w menedżerze grafów filtru. Wywołując metodę IFilterGraph::EnumFilters, identyfikator PID może wyliczać filtry na grafie i dystrybuować wywołania metod do tych filtrów. W ten sposób piD może służyć jako pojedynczy punkt kontrolny dla aplikacji do wywoływania metod w filtrach.

Gdy menedżer wykresu filtru agreguje identyfikator PID, wysyła zapytanie do identyfikatora PID dla interfejsu IDistributorNotify. Jeśli piD obsługuje ten interfejs, menedżer grafów filtrów używa go do powiadamiania piD o zmianach na grafie:

Aby zaimplementować niestandardowy identyfikator PID, utwórz obiekt COM, który obsługuje agregację. Musi obsługiwać interfejs, który menedżer grafów filtrów nie obsługuje jeszcze. Opcjonalnie może obsługiwać interfejs IDistributorNotify.

Jeśli identyfikator PID uzyskuje jakiekolwiek wskaźniki interfejsu z menedżera wykresu filtru, powinien natychmiast je zwolnić. W przeciwnym razie może to spowodować utworzenie cyklicznej liczby odwołań, co może uniemożliwić zniszczenie menedżera grafów filtrów. Przechowywanie liczby odwołań w menedżerze grafów filtrów jest niepotrzebne w każdym przypadku, ponieważ menedżer wykresów filtrów kontroluje okres istnienia identyfikatora PID.

Ponieważ piD jest przeznaczony specjalnie do agregacji przez menedżera grafów filtrów, możesz wymusić to w metodzie konstruktora PID. Sprawdź, czy wskaźnik IUnknown jest NULL, a jeśli tak, zwróć kod błędu VFW_E_NEED_OWNER. (Zobacz kody błędów i powodzenia.) Ponadto, aby uniemożliwić innym obiektom agregowanie identyfikatora PID, można wykonać zapytanie względem zewnętrznego IUnknown wskaźnika dla interfejsu IGraphBuilder. Zwróć kod błędu, jeśli obiekt nie uwidacznia IGraphBuilder.