次の方法で共有


Windows Media Format SDK のロックを解除する

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

Windows Media Format SDK のバージョン 7 または 7.1 にアクセスするには、実行時にアプリケーションでソフトウェア証明書 (キーとも呼ばれます) を提供する必要があります。 このキーは、ビルド時にアプリケーションがリンクする wmstub.lib という静的ライブラリに含まれています。 個別化されたキーは、DRM で保護されたファイルを作成または読み取る場合にのみ必要です。 DRM 以外のファイルは、Windows Media Format SDK で提供されている静的ライブラリを使用して作成できます。 DRM キーの取得の詳細については、Windows Media Format SDK を参照してください。 DirectShow アプリケーションは、フィルター グラフに追加されるときに、その証明書を WM ASF ライターに提供します。 アプリケーションは、COM IServiceProvider インターフェイスと IObjectWithSite インターフェイスを使用してキー プロバイダーとして登録する必要があります。 この手法を使用して、アプリケーションは IServiceProvider から派生したキー プロバイダー クラスを実装します。 このクラスは、AddRefQueryInterfaceRelease の 3 つの標準 COM メソッドと、フィルター グラフ マネージャーによって呼び出される 1 つの追加メソッド QueryService を実装します。 QueryService は、Windows Media Format SDK メソッド WMCreateCertificate を呼び出し、作成された証明書へのポインターをフィルター グラフ マネージャーに返します。 証明書が有効な場合、フィルター グラフ マネージャーでは、グラフ作成プロセスを続行できます。

注意

アプリケーションをビルドするには、 WMCreateCertificate のプロトタイプに Wmsdkidl.h を含め、Wmstub.lib ライブラリにリンクします。

 

次のコード例は、このプロセスの基本的な手順を示しています。

// 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.

DirectShow での ASF ファイルの作成