gpt4 book ai didi

c++ - DirectShow BindToObject 返回无效句柄

转载 作者:行者123 更新时间:2023-11-28 07:58:51 26 4
gpt4 key购买 nike

编辑

刚刚测试了 playcap.cpp,我也遇到了同样的错误,所以我知道这不是我的代码的错误。

--

编辑 2

编辑我的代码以保留 goodMoniker 指针。然而,同样的错误。

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

--

让我的网络摄像头与 DirectShow 一起工作时遇到问题。这一行:

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

从 MSVC++ 2010 EE 返回以下错误:

First-chance exception at 0x777ff9d2 in WebcamControlTest.exe: 0xC0000008: An invalid handle was specified.

完整代码在这里(几乎完全从 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();
}

这可能是一个驱动程序问题,因为只有一个设备可以工作(一个用于截屏的虚拟驱动程序,而不是实际的网络摄像头输入),但我已经更新、卸载并重新安装,但没有成功。有什么想法吗?

最佳答案

在 goodMoniker 中保存一个指针后,您可以在下面几行 (pMoniker->Release()) 中释放该对象。现在 goodMoniker 指向一个已释放的对象。您应该增加它的引用计数。

关于c++ - DirectShow BindToObject 返回无效句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12030590/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com