0

編集

playcap.cpp をテストしたところ、同じエラーが発生するので、コードのせいではないことがわかります。

--

編集2

goodMoniker ポインターを保持するようにコードを編集しました。ただし、同じエラー。

+if(pMoniker != goodMoniker)
+{
    pMoniker->Release();
+}

--

ウェブカメラを DirectShow で動作させるのに問題があります。この行:

hr = goodMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)(&pCap));

MSVC++ 2010 EE から次のエラーを返します。

WebcamControlTest.exe の 0x777ff9d2 での初回例外: 0xC0000008: 無効なハンドルが指定されました。

完全なコードはこちら ( MSDNからほぼ完全にリッピング):

#include <DShow.h>
#include <iostream>

int main(void)
{
    IGraphBuilder* pGraph = NULL;
    ICaptureGraphBuilder2* pBuild = NULL;

    HRESULT hr;

    //Initialize pGraph
    hr = CoInitialize(NULL);
    hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**) &pBuild);
    if(FAILED(hr))
    {
        printf("ERROR - Could not initialize COM library");
        return 1;
    }

    //Initialize pBuild
    hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **) &pGraph);
    if(FAILED(hr))
    {
        printf("ERROR - Could not create the Filter Graph Manager.");
        return 2;
    }
    pBuild->SetFiltergraph(pGraph);

    //Initialize pCap
    ICreateDevEnum* pDevEnum = NULL;
    IEnumMoniker* pEnum = NULL;

    hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, reinterpret_cast<void**>(&pDevEnum));
    if(SUCCEEDED(hr))
    {
        hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnum, 0);
    }

    IMoniker* goodMoniker = NULL; 

    HWND hList;
    IMoniker *pMoniker = NULL;
    while(pEnum->Next(1, &pMoniker, NULL) == S_OK)
    {
        IPropertyBag* pPropBag;
        hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void**)(&pPropBag));
        if(FAILED(hr))
        {
            pMoniker->Release();
            continue;
        }

        VARIANT varName;
        VariantInit(&varName);
        hr = pPropBag->Read(L"Description", &varName, 0);
        if(FAILED(hr))
        {
            hr = pPropBag->Read(L"FriendlyName", &varName, 0);
        }
        if(SUCCEEDED(hr))
        {
            for(int i=0;i<8;i++)
            {
                std::cout<<(char)*(varName.bstrVal + i);
            }

            char yn;
            std::cin>>yn;

            if(yn=='Y')
            {
                std::cout<<"SUCCESSFUL"<<std::endl;
                goodMoniker = pMoniker;
                VariantClear(&varName);
            }
        }
        pPropBag->Release();
        if(pMoniker != goodMoniker)
        {
            pMoniker->Release();
        }
    }

    IBaseFilter* pCap;
    hr = goodMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)(&pCap));
    if(SUCCEEDED(hr))
    {
        hr = pGraph->AddFilter(pCap, L"Capture Filter");
    }

    hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap, NULL, NULL);
    while(SUCCEEDED(hr));

    pGraph->Release();
    pBuild->Release();
    pCap->Release();
}

動作するデバイスが 1 つあるため (実際の Web カメラ入力ではなく、スクリーンキャッピング用の仮想ドライバー)、ドライバーの問題である可能性がありますが、更新、アンインストール、および再インストールしてもうまくいきませんでした。何か案は?

4

1 に答える 1

1

goodMoniker にポインターを保存した後、数行下のオブジェクトを解放します (pMoniker->Release() )。これで、goodMoniker は解放されたオブジェクトを指します。参照カウントを増やしたはずです。

于 2012-08-23T10:20:47.937 に答える