Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]
Bestimmte Kernelmodusfilter können nicht über CoCreateInstance erstellt werden und verfügen daher über keine CLSIDs. Zu diesen Filtern gehören der Tee/Sink-to-Sink-Konverter, der CC-Decoderfilter und der WST-Codec-Filter. Um einen dieser Filter zu erstellen, verwenden Sie das System Device Enumerator-Objekt , und suchen Sie nach dem Namen des Filters.
- Erstellen Sie den Systemgeräte-Enumerator.
- Rufen Sie die ICreateDevEnum::CreateClassEnumerator-Methode mit der CLSID der Filterkategorie für diesen Filter auf. Diese Methode erstellt einen Enumerator für die Filterkategorie. (Ein Enumerator ist einfach ein Objekt, das mithilfe einer definierten COM-Schnittstelle eine Liste anderer Objekte zurückgibt.) Der Enumerator gibt IMoniker-Zeiger zurück, die die Filter in dieser Kategorie darstellen.
- Rufen Sie für jeden Moniker IMoniker::BindToStorage auf, um eine IPropertyBag-Schnittstelle abzurufen.
- Rufen Sie IPropertyBag::Read auf, um den Namen des Filters abzurufen.
- Wenn der Name übereinstimmt, rufen Sie IMoniker::BindToObject auf, um den Filter zu erstellen.
Der folgende Code zeigt eine Funktion, die die folgenden Schritte ausführt:
HRESULT CreateKernelFilter(
const GUID &guidCategory, // Filter category.
LPCOLESTR szName, // The name of the filter.
IBaseFilter **ppFilter // Receives a pointer to the filter.
)
{
HRESULT hr;
ICreateDevEnum *pDevEnum = NULL;
IEnumMoniker *pEnum = NULL;
if (!szName || !ppFilter)
{
return E_POINTER;
}
// Create the system device enumerator.
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
IID_ICreateDevEnum, (void**)&pDevEnum);
if (FAILED(hr))
{
return hr;
}
// Create a class enumerator for the specified category.
hr = pDevEnum->CreateClassEnumerator(guidCategory, &pEnum, 0);
pDevEnum->Release();
if (hr != S_OK) // S_FALSE means the category is empty.
{
return E_FAIL;
}
// Enumerate devices within this category.
bool bFound = false;
IMoniker *pMoniker;
while (!bFound && (S_OK == pEnum->Next(1, &pMoniker, 0)))
{
IPropertyBag *pBag = NULL;
hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
if (FAILED(hr))
{
pMoniker->Release();
continue; // Maybe the next one will work.
}
// Check the friendly name.
VARIANT var;
VariantInit(&var);
hr = pBag->Read(L"FriendlyName", &var, NULL);
if (SUCCEEDED(hr) && (lstrcmpiW(var.bstrVal, szName) == 0))
{
// This is the right filter.
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter,
(void**)ppFilter);
bFound = true;
}
VariantClear(&var);
pBag->Release();
pMoniker->Release();
}
pEnum->Release();
return (bFound ? hr : E_FAIL);
}
Im folgenden Codebeispiel wird diese Funktion verwendet, um den CC-Decoderfilter zu erstellen und dem Filterdiagramm hinzuzufügen:
IBaseFilter *pCC = NULL;
hr = CreateKernelFilter(AM_KSCATEGORY_VBICODEC,
OLESTR("CC Decoder"), &pCC);
if (SUCCEEDED(hr))
{
hr = pGraph->AddFilter(pCC, L"CC Decoder");
pCC->Release();
}
Zugehörige Themen