Dela via


Låsa upp Windows Media Format SDK

[Funktionen som är associerad med den här sidan, DirectShow, är en äldre funktion. Det har ersatts av MediaPlayer, IMFMediaEngineoch Audio / Video Capture i Media Foundation. Dessa funktioner har optimerats för Windows 10 och Windows 11. Microsoft rekommenderar starkt att ny kod använder MediaPlayer, IMFMediaEngine och Audio/Video Capture i Media Foundation i stället för DirectShow, när det är möjligt. Microsoft föreslår att befintlig kod som använder äldre API:er skrivs om för att använda de nya API:erna om möjligt.]

För att få åtkomst till version 7 eller 7.1 av Windows Media Format SDK måste ett program tillhandahålla ett programvarucertifikat, även kallat en nyckel, vid körning. Den här nyckeln finns i ett statiskt bibliotek med namnet wmstub.lib som programmet länkar till vid byggtiden. En individualiserad nyckel krävs bara för att skapa eller läsa DRM-skyddade filer. Icke-DRM-filer kan skapas med hjälp av det statiska biblioteket som tillhandahålls med Windows Media Format SDK. Mer information om hur du hämtar DRM-nyckeln finns i Windows Media Format SDK. Ett DirectShow-program tillhandahåller sitt certifikat till WM ASF Writer när det läggs till i filterdiagrammet. Programmet måste registreras som en nyckelleverantör med hjälp av COM IServiceProvider och IObjectWithSite-gränssnitt. Med den här tekniken implementerar programmet en nyckelproviderklass som härleds från IServiceProvider. Den här klassen implementerar de tre com-standardmetoderna–AddRef, QueryInterfaceoch Release– tillsammans med ytterligare en metod, QueryService, som anropas av filtergrafhanteraren. QueryService anropar Windows Media Format SDK-metoden WMCreateCertificate och återger en pekare till det skapade certifikatet till filtergrafhanteraren. Om certifikatet är giltigt tillåter filtergrafhanteraren att grafskapandeprocessen fortsätter.

Not

Om du vill skapa ett program inkluderar du Wmsdkidl.h för prototypen för WMCreateCertificateoch länkar till biblioteket Wmstub.lib.

 

Följande kodexempel illustrerar de grundläggande stegen i den här processen:

// Declare and implement a key provider class derived from IServiceProvider.

class CKeyProvider : public IServiceProvider {
public:
    // IUnknown interface
    STDMETHODIMP QueryInterface(REFIID riid, void ** ppv);
    STDMETHODIMP_(ULONG) AddRef();
    STDMETHODIMP_(ULONG) Release();

    CKeyProvider();

    // IServiceProvider
    STDMETHODIMP QueryService(REFIID siid, REFIID riid, void **ppv);
    
private:
    ULONG m_cRef;
};

CKeyProvider::CKeyProvider() : m_cRef(0)
{
}

// IUnknown methods
ULONG CKeyProvider::AddRef()
{
    return InterlockedIncrement(&m_cRef);
}

ULONG CKeyProvider::Release()
{
    ASSERT(m_cRef > 0);

    ULONG lCount = InterlockedDecrement(&m_cRef);
    if (m_cRef == 0) 
    {
        delete this;
        return (ULONG)0;
    }
    return (ULONG)lCount;
}

// We only support IUnknown and IServiceProvider.
HRESULT CKeyProvider::QueryInterface(REFIID riid, void ** ppv)
{
    if (!ppv) return E_POINTER;

    if (riid == IID_IUnknown) 
    {
        *ppv = (void *) static_cast<IUnknown *>(this);
        AddRef();
        return S_OK;
    }
    if (riid == IID_IServiceProvider) 
    {
        *ppv = (void *) static_cast<IServiceProvider *>(this);
        AddRef();
        return S_OK;
    }

    return E_NOINTERFACE;
}

STDMETHODIMP CKeyProvider::QueryService(REFIID siid, REFIID riid, void **ppv)
{
    if (!ppv) return E_POINTER;

    if (siid == __uuidof(IWMReader) && riid == IID_IUnknown) 
    {
        IUnknown *punkCert;
        HRESULT hr = WMCreateCertificate(&punkCert);
        if (SUCCEEDED(hr)) 
        {
            *ppv = (void *) punkCert;
        }
        return hr;
    }
    return E_NOINTERFACE;
}

////////////////////////////////////////////////////////////////////
//
// These examples illustrate the sequence of method calls
// in your application. Error checking is omitted for brevity.
//
///////////////////////////////////////////////////////////////////

// Create the filter graph manager, but don't add any filters.
IGraphBuilder *pGraph;
hr = CreateFilterGraph(&pGraph);

...

// Instantiate the key provider class, and AddRef it
// so that COM doesn't try to free our static object.

CKeyProvider prov;
prov.AddRef();  // Don't let COM try to free our static object.

// Give the graph an IObjectWithSite pointer for callbacks and QueryService.
IObjectWithSite* pObjectWithSite = NULL;

hr = pGraph->QueryInterface(IID_IObjectWithSite, (void**)&pObjectWithSite);
if (SUCCEEDED(hr))
{
    // Use the IObjectWithSite pointer to specify our key provider object.
    // The filter graph manager will use this pointer to call
    // QueryService to do the unlocking.
    // If the unlocking succeeds, then we can build our graph.

    pObjectWithSite->SetSite((IUnknown *) (IServiceProvider *) &prov);
    pObjectWithSite->Release();
}

// Now build the graph.

Skapa ASF-filer i DirectShow