项目C ++中的DirectShow自定义过滤器

时间:2014-01-22 14:46:13

标签: c++ windows-7 directshow

我正在编写一个自定义转换过滤器,如MSDN教程中所示: http://msdn.microsoft.com/en-us/library/windows/desktop/dd391015%28v=vs.85%29.aspx

用我的主DirectShow projet编写(我不是用过滤器制作DLL)

问题是我不知道如何创建/使用过滤器。我尝试过CoCreateInstance

SmartPtr<IFilterRotation> _pRotation = 0; // My custom filter
if(!SUCCEEDED(_mResult = CoCreateInstance(CLSID_FilterRotation, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void**)&_pRotation)))
{
      return _mResult;
}

但它返回以下错误:REGDB_E_CLASSNOTREG

以下是我暂时覆盖的所有元素:

#pragma once

// {4A80F8B5-CFB0-4dc6-96C5-DA427B6DB8BD}
DEFINE_GUID(CLSID_FiltreRotation, 
0x4a80f8b5, 0xcfb0, 0x4dc6, 0x96, 0xc5, 0xda, 0x42, 0x7b, 0x6d, 0xb8, 0xbd);


    class IFilterRotation: public CTransformFilter
    {
    public:
        IFilterRotation(void);
        ~IFilterRotation(void);

    HRESULT IFilterRotation::CheckInputType(const CMediaType *vpMediaTypeIn);
    HRESULT IFilterRotation::CheckTransform(const CMediaType *vpMediaTypeIn,
                                            const CMediaType *vpMediaTypeOut);
    HRESULT IFilterRotation::DecideBufferSize(IMemAllocator *vpAllocation,
                                              ALLOCATOR_PROPERTIES *vppRequeteProprieteIn);
    HRESULT IFilterRotation::GetMediaType(int vPosition,
                                          CMediaType *vpMediaType);
    HRESULT IFilterRotation::Transform(IMediaSample *vpMediaSampleIn,
                                       IMediaSample *vpMediaSampleOut);

    };

我错过了什么吗? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

IFilterRotation应该有私有构造函数和析构函数,因为它是一个COM对象(你想阻止在堆栈上创建一个实例,或者通过调用new,因为引用计数...你想通过调用delete来防止破坏这样的对象好)。一旦引用计数降至零,它将自行销毁。 添加静态方法以创建IFilterRotation的实例。

static IFilterRotation * createInstance()
{
    IFilterRotation  * const pFilterRotation( new (std::nothrow) IFilterRotation() );

    if( pFilterRotation )
        pFilterRotation->AddRef();

    return pFilterRotation;
}  

只有将过滤器作为单独的DLL时,才能使用CoCreateInstance()。当然,您还必须在使用CoCreateInstance()之前注册此类DLL。

答案 1 :(得分:1)

逻辑链如下:

  • CoCreateInstance需要CLSID_Xxx
  • CLSID_Xxx不仅需要定义,还应该由项目正确提供
    • ...这意味着您应该有一个CFactoryTemplate实例将CLSID映射到您的班级

您可以参考其中一个Windows SDK示例获取详细信息,我建议特别推荐EZRGB24

您只显示在项目中定义了CLSID。类IFilterRotation对我来说看起来不太好(你通常不会从C-thing继承I-thing,但它是一个命名问题)。你没有显示你是否有CFactoryTemplate,我想你没有。{/ p>

但是,当您将过滤器放入DLL时,这一切都是正确的。在您的情况下,您似乎根本没有注册COM类,因此CoCreateInstance不适合您。你可以选择将类放入DLL中,或者CoRegisterClassObject这个类使它能够显示CoCreateInstance,或者创建一个类的简单C ++实例(operator new或stack / static instance)直接传递给AddFilter