DirectShow自定义过滤器项目C



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

它是用我的主要直接藏品编写的(我不是用过滤器制作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);
    };

我想念什么吗?预先感谢。

逻辑链在这里如下:

  • CoCreateInstance服用CLSID_Xxx
  • CLSID_Xxx不仅需要定义,而且还应由您的项目正确提供
    • ...这意味着您应该将CFactoryTemplate实例映射到类的CLSID

您可以参考Windows SDK样本之一以获取详细信息,我建议EZRGB24

您只显示您在项目中定义了CLSID。IFilterRotation级对我来说并不好(您通常不会从C-thing继承I-thing,但这是一个命名的问题)。您没有显示您是否有CFactoryTemplate,我想您没有。

但是,当您将过滤器放入DLL中时,这一切都是正确的。在您的情况下,您似乎根本没有注册COM课程,因此CoCreateInstance对您不起作用。您的选项要么将课程放入DLL,要么将CoRegisterClassObject放入此类中以启用其CoCreateInstance的可见性,或者创建类的简单C 实例(操作员新或堆栈/静态实例),然后直接传递给AddFilter

ifilterRotation应该具有私有构造函数和驱动器,因为它是一个com对象(您想防止在堆栈上创建实例,或者是因为参考计数而调用新的实例。也通过调用删除来防止破坏该物体)。一旦参考计数降至零,它将破坏自身。添加静态方法来创建iFilterRotation实例。

static IFilterRotation * createInstance()
{
    IFilterRotation  * const pFilterRotation( new (std::nothrow) IFilterRotation() );
    if( pFilterRotation )
        pFilterRotation->AddRef();
    return pFilterRotation;
}  

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

最新更新