利用 DirectShow 开发自己的 Filter
2006-07-23 11:33:58 来源:WEB开发网核心提示: Filter在这里使用了一个类厂模板类来当作Filter的类厂对象,下面看看类厂在DShow是怎么工作的,利用 DirectShow 开发自己的 Filter(4), 类厂对象也是一个com组件,本来DllGetClassObject是应该由我们自己完成一个函数,然后客户端可以根据返回去
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;
}
你可以声明自己的类厂数组如下:
Tags:利用 DirectShow 开发
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接