我正在编写一个自定义转换过滤器,如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);
};
我错过了什么吗? 提前谢谢。
答案 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
。