写一个Filter至少需要那些东西。
[文章信息] | |
作者: | 智慧的鱼 |
时间: | 2004-12-20 |
出处: | 天极网 |
1、Filter的实现类
在这里就是CMyFilter类,在这个类里你可以实现自己的逻辑上的功能,包括定义你的filter的特性,给你的filter配备pin接口等。
2、com组件的引出函数
五个全局函数:
DllMain //dll的入口函数
DllGetClassObject //获得com组件的类厂对象
DllCanUnloadNow //com组件是否可以卸载
DllRegisterServer //注册com组件
DllUnregisterServer //卸载com组件
其中DllGetClassObject 已经由基类完成你自己只要完成三个函数即可DllMain,DllRegisterServer,DllUnregisterServer。
3、com组件的类厂对象
类厂对象是用来生成Filter对象的,用的模板类定义了一个全局的模板类对象数组,一般格式如下
CFactoryTemplate g_Templates[1] = { { L"my filter", // Name &CLSID_MYFilter, // CLSID CMyFilter::CreateInstance, // Method to create an instance of MyComponent NULL, // Initialization function &sudInfTee // Set-up information (for filters) } }; int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]); |
4、关于你自己定义的Filter以及Pin的信息
这些是一个全局的结构变量,用于描述你的Filter和你定义的pin,在注册Filter的时候会用到,如下
AMOVIESETUP_FILTER 描述一个Filter
AMOVIESETUP_PIN 描述pin
AMOVIESETUP_MEDIATYPE 描述数据类型
下面的代码描述了一个Filter带有一个output PIN
static const WCHAR g_wszName[] = L"Some Filter"; AMOVIESETUP_MEDIATYPE sudMediaTypes[] = { { &MEDIATYPE_Video, &MEDIASUBTYPE_RGB24 }, { &MEDIATYPE_Video, &MEDIASUBTYPE_RGB32 }, }; AMOVIESETUP_PIN sudOutputPin = { L"", // Obsolete, not used. FALSE, // Is this pin rendered? TRUE, // Is it an output pin? FALSE, // Can the filter create zero instances? FALSE, // Does the filter create multiple instances? &GUID_NULL, // Obsolete. NULL, // Obsolete. 2, // Number of media types. sudMediaTypes // Pointer to media types. }; AMOVIESETUP_FILTER sudFilterReg = { &CLSID_SomeFilter, // Filter CLSID. g_wszName, // Filter name. MERIT_NORMAL, // Merit. 1, // Number of pin types. &sudOutputPin // Pointer to pin information. }; |
最后如果你还是调试通不过,看看你是否包含了下面的头文件
#include streams.h #include initguid.h #include tchar.h #include stdio.h |