CoCreateInstance为CLSID_WavDest创建空的IBaseFilter

CoCreateInstance creates empty IBaseFilter for CLSID_WavDest

本文关键字:IBaseFilter 创建 WavDest CLSID CoCreateInstance      更新时间:2023-10-16

我试图通过在c++ Visual Studio 2010项目中使用directshow framework来记录.wav。我遵循本指南的WAV文件部分:https://msdn.microsoft.com/en-us/library/windows/desktop/dd375005(v=vs.85).aspx

我已经建立了WavDest.dll,将其添加到注册表中,在注册表中找到它,它可以添加为Graphedit中的过滤器。我对_CLSID_WavDest有未解决的外部符号错误,但通过在我的StdAfx.h中包括InitGuid.h并链接WavDest.lib来修复它。

现在我没有错误,程序没有崩溃,但我得到0字节的wav文件。

代码段:

res = AddFilterByCLSID(dshow_dev->m_pGraph, CLSID_WavDest, (IBaseFilter **)&dshow_dev->m_pWaveDest, L"WavDest");
res = AddFilterByCLSID(dshow_dev->m_pGraph, CLSID_FileWriter, (IBaseFilter **)&dshow_dev->m_pWaveWriter, L"File Writer");

res = dshow_dev->m_pWaveWriter->QueryInterface(IID_IFileSinkFilter, (void**)&dshow_dev->m_pFileSink);
res = dshow_dev->m_pFileSink->SetFileName(L"D:\test.wav", NULL);
res = ConnectFilters(dshow_dev->m_pGraph, dshow_dev->m_pCaptureSourceAudio, dshow_dev->m_pWaveDest);
res = ConnectFilters(dshow_dev->m_pGraph, dshow_dev->m_pWaveDest, dshow_dev->m_pWaveWriter);

AddFilterByCLSID for CLSID_WavDest返回S_OK,但dshow_dev->m_pWaveDest有以下值:-

[CWavDestFilter]    {m_cbWavData=0x00000000 m_cbHeader=0x00000000 } CWavDestFilter

.

因此,m_pWaveDestConnectFilters返回E_Fail,不录制音频。

我已经尝试了WavDest.dll的调试和发布版本注册(首先调试,然后unreg调试和reg发布)。

我已经检查了代码中的其他一切,图形(dshow_dev->m_pGraph)运行良好的视频预览和编写AVI文件(带音频)。

我确信我在WavDest集成中做错了什么,但我不知道是什么。

毕竟是我的错。我已经替换了

assert(pResult != NULL);
函数

// Match a pin by pin direction and connection state.
HRESULT MatchPin(IPin *pPin, PIN_DIRECTION direction, BOOL bShouldBeConnected, BOOL *pResult)
{
    assert(pResult != NULL);
    BOOL bMatch = FALSE;
    BOOL bIsConnected = FALSE;
    HRESULT hr = IsPinConnected(pPin, &bIsConnected);
    if (SUCCEEDED(hr))
    {
        if (bIsConnected == bShouldBeConnected)
        {
            hr = IsPinDirection(pPin, direction, &bMatch);
        }
    }
    if (SUCCEEDED(hr))
    {
        *pResult = bMatch;
    }
    return hr;
}

if(pResult == NULL);
{
    HRESULT hr = E_FAIL;
    return hr;
}