我目前正在编写一个自定义变换过滤器,如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。