科技时代新浪首页 > 科技时代 > 软件 > 正文

利用DirectShow开发自己的Filter(3)


http://www.sina.com.cn 2004年12月20日 10:08 天极yesky

  文/智慧的鱼

  三 如何实现Filter 的类厂对象

  我们知道一个Filter是一个com组件,所以它com特性的实现其实在其基类中实现的,比如IUnknown接口,我们直接从基类派生出我们的Filter后,它就支持com接口了,它就是一个com组件了。

  所有的com组件为了实现二进制的封装,所以连创建的接口都封装了,因此每个com对象都有个类对象(也叫类厂对象,本身也
是com对象,用来创建com组件)来创建com组件。

  下面温习一下com组件的创建过程,其中涉及到几个函数

  1、当客户端要创建一个com组件时,它通过底层的COM API函数 CoGetClassObject()使用SCM的服务,这个函数请SCM把一个指针绑定到客户端请求的com组件的类对象上,其实在CoGetClassObject()里它装载了该DLL的库,通过该dll的导出函数DllGetClassObject();DllGetClassObject根据客户端提供的com组件CLASSID,返回该com组件类对象的指针。下面com组件的创建和SCM无关了。

  2、客户端利用组件的类对象(类厂对象)的IClassFactory::CreateInstance方法创建com组件。

  Filter在这里使用了一个类厂模板类来当作Filter的类厂对象。下面看看类厂在DShow是怎么工作的。

  类厂对象也是一个com组件。本来DllGetClassObject是应该由我们自己完成一个函数,在directshow基类里已经完成了,我们不用管它了。它的功能就是来寻找这个DLL中的类厂对象,看是否有符合客户端请求的类厂对象。

  DLL里声明了一个全局的类厂模板数组,当DllGetClassObject请求类厂对象的时候,它就搜索这个数组,看是否有和CLSID匹配的类厂对象。当它找到一个匹配的CLSID,它就创建一个类厂对象,然后讲类厂指针返回给CoGetClassObject,然后客户端可以根据返回去的类厂指针,调用 IClassFactory::CreateInstance方法创建组件,类厂就根据数组里定义的方法创建com组件。

  factory template包含下列变量:

const WCHAR * m_Name; // Name
const CLSID * m_ClsID; // CLSID
LPFNNewCOMObject m_lpfnNew; // Function to create an instance of the component
LPFNInitRoutine m_lpfnInit; // Initialization function (optional)
const AMOVIESETUP_FILTER * m_pAMovieSetup_Filter; // Set-up information (for filters)


  其中的两个函数指针m_lpfnNew and m_lpfnInit使用下面的定义

typedef CUnknown *(CALLBACK *LPFNNewCOMObject)(LPUNKNOWN pUnkOuter, HRESULT *phr);
typedef void (CALLBACK *LPFNInitRoutine)(BOOL bLoading, const CLSID *rclsid);


  你可以参照如下的方式定义你的类厂对象

CUnknown * WINAPI CMyFilter::CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr)
{
 CMyFilter *pFilter = new CMyFilter(NAME("my Filter"), pUnk, pHr);
 if (pFilter== NULL)
 {
  *pHr = E_OUTOFMEMORY;
 }
 return pFilter;
}


  你可以声明自己的类厂数组如下:

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]);


  如果在这个com组件中你要支持多个filter,你可以在这个数组中继续添加就是了。

[上一页]  [1]  [2]  [3]  [4]  [5]  [下一页]


  点击此处查询全部DirectShow新闻

新浪科技24小时热门新闻排行     硬件驱动程序高速下载

评论】【应用软件】【推荐】【 】【打印】【下载点点通】【关闭
 

 
新 闻 查 询
关键词一
关键词二



热 点 专 题
健力宝收购案风云突变
联想收购IBM PC业务
高峰私生子案一审判决
中外乒乓球明星对抗赛
女人与车的美丽约会
自己建房开发商靠边站
图集:中外豪宅大比拼
娱乐风月图鉴
岁末读书频道大盘点

 
 



科技时代意见反馈留言板 电话:010-82628888-5488   欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

Copyright © 1996 - 2004 SINA Inc. All Rights Reserved

版权所有 新浪网