Filter的注册2
既然Filter是一种COM组件,使用前就必须先注册。Filter的注册程序为regsvr32.exe (位于操作系统目录的system32子目录下)。假设现在有一个Filter文件,它的完整路径为C:/DSFilters/myFilter.ax,那么注册这个Filter的方法为:在命令行状态下,执行regsvr32 C:/DSFilters/myFilter.ax。随后会弹出一个对话框,告诉Filter注册是否成功。
提示: 注销Filter也是使用regsvr32.exe程序,方法为加命令行参数/u,即执行regsvr32 /u C:\DSFilters\myFilter.ax。另外一个命令行参数…/s’可以禁止regsvr32. exe
后弹出提示对话框。
问: 给出一个Filter的CLSID,如何判断这个Filter是否已经注册?
答:最简单的办法就是使用CoCreatelnstance函数创建这个Filter,然后根据函数的返
回值去判断。代码如下:
BOOL IsFilterReglstered(CLSID inFi2terId)
{
IBaseFilter*pFilter=NULL;
if(SUCCEEDED(CoCreateYnstance finFilterId,NULL,CLSCTX
INPROC—SERVER,IID_IBaseFilter,(void**)&pFiiter)))
{
pFilter->Release();
return TRUE;
}
return FALSE;
}
一般一个Filter项目都会包含一个.def文件,用于定义4个导出函数。代码如下:
EXPORTS
DllGetClassObJect PRIVATE
DllCanUnloadNow PRIVATE
DllRegisterServer PRIVATE
DllUnreqiSterSeryer PRIVATE
这是COM规范的实现。其中,DllGetclassObject在创建Filter对象的时候被调用,根据CLSID返回对应的类工厂对象;DllCanUnloadNow用于判断是否可以从内存中卸载Filter DLL,即DLL中实现的所有COM对象是否都已经释放;DllRegisterServer和
DllUnregisterServer完成COM组件的自注册功能,一般实现代码如下:
STDAPI D1lReglsterServer()
{
return AMovieDllRegisterServer2(TRUE);
)
STDAPI DllunreglsterServer()
{
return AMovieDllRegisterServer2(FALSE);
)
提示:AMovieDllRegilsterServer2是DirectShow SDK提供的专门用于Filter注册的一个API函数。可以在SDK基类源代码的dllsetup.cpp中找到这个函数的实现。
问:如何在应用程序中注册(或注销)某个Filter文件?
答:只要在应用程序中使用LoadLibrary装载这个Filter文件,并得到它的导出函数 DllRegisterServer(或DllUnregisterServer)的入口地址,然后执行它就可以了。下面是注册一个Filter的参考代码:
BOOL RegisterFilter(const char*inFiiterAx)
{
typedef(WINAPI*REGISTER_FUNC)(void);
REGISTER_FUNC MyFunc=NULL;
HMODULE hModule= ::LoadLlbrary(inFiIterAx);
if(hModule)
{
MyFunc=(REGISTER_FUNC)GetProcAddress(hModule,
”D1iRegisterServer”);
BOOL pass=(MyFunc != NULL);
if(pass)
{
MyFunc();
]
::FreeLibrary(hModule);
return pass;
}
return FALSE;
}
Filter的注册信息一般包括两部分:基本的COM信息和Filter特有信息。前者是基本的COM组件所必需的信息,没有这部分内容,将无法成功创建Filter;后者是描述Filter 的信息(包括Filter注册的类型目录、Filter上Pin的数量、支持的媒体类型等),这部分 内容会被系统枚举器或者Filter映射器访问到,但并不是必需的。
所谓“注册”,也就是向系统注册表的相应位置写入一些数据。Filter的基本COM信息写入注册表的如下位置:
HKEY_CLASSES_ROOT
CLSID
Filter CLSID
REG_SZ:(Default)=Friendly name
InprocServer32
REG_SZ:(Default)=File name of the DLL
REG_SZ:ThreadingModel=Both
Filter特有信息写入注册表的如下位置
HKEY_CLASSES_ROOT
CLSID
Category
Instance
Filter CLSID
REG SZ;CLSID=Filter CLSID
REG BINARY:Filter Data=Filter information
REG SZ: FrlendlyName=Friendly name
其中,Category是为Filter注册的类型目录,它是一个GUID字符串。
提示:我们自己开发的Filter大多数情况下都是注册在DirectShow Filters目录下,这个目录的GUlD为CLSID_LegacyAmFilterCategory,字符串为{083863F1-70DE-11d0-
BD40-00A0C911CE86)。
Filter的注册目录有很多,可以在如图2.2所示的GraphEdit(即bin/DXUtils/graphedt.exe)程序中,选择菜单项Graph|InsertFilters查看到,如图2.3所示。

表2 1 常用Filter类型目录与CLSID对照表
| Audio Capture Sources | CLSID _ AudioInputDeviceCategory | MERIT_DO_NOT_USE |
| Audio Compressors | CLSID_AudioCompressorCategory | MERIT_ DO_ NOT_USE |
| Audio Renderers | CLSID_AudioRendererCategory | MERIT_ NORMAL |
| DirectShow Filters | CLSID_LegacyAmFilterCategory | MERIT_NORMAL |
| Midi Renderers | CLSID_ MidiRendererCategory | MERIT NORMAL |
| Video Capture Sources | CLSID_ VideoInputDeviceCategory | MERIT DO_NOT_USE |
| Video Compressors | CLSID_videoCompressorCategory | MERIT DO_NOT_USE |
| Video Effects(1 input) | CLSID_videoEffects1Category | MERIT DO_NOT_USE |
| Video Effects(2 inputs) | Video Effects(2 inputs) | MERIT DO_NOT_USE |
| WDM StreamingCapture Devices | AM_KSCATEGORYCAPTURE | MERIT DO_NOT_USE |
| WDM Streaming Crossbar Devices | AM_KSCATEGORY_ CROSSBAR | MERIT DO_NOT_USE |
| WDM Streaming TV Audio Devices | AM_KSCATEGORY_TVAUDIO | MERIT DO_NOT_USE |
| WDM Streaming TV Tuner Devices | AM_KSCATEGORY_TVTUNER | MERIT DO_NOT_USE |
提示:可以在注册表的KEY_CLASSES_ROOT/CLSlD/CLSlD_ActiveMovieCategories/instance下找到系统中注册的所有Filter类型目录。除了DirectShow使用的标准类型目录外,也可以创建自己的类型目录,只需将自定义的类型目录的CLSID在上述位置进行注册即可。在注册表中看到的CLSlD_ActiveMovieCategofies的GUID字符串,实际为{da4e3da0-d07d-11d0-bd50—00a0c91lce86)。
Filter的注册2的更多相关文章
- spring-boot-2.0.3源码篇 - filter的注册,值得一看
前言 开心一刻 过年女婿来岳父家走亲戚,当时小舅子主就问:姐夫,你什么时候能给我姐幸福,让我姐好好享受生活的美好.你们这辈子不准备买一套大点的房子吗?姐夫说:现在没钱啊!不过我有一个美丽可爱的女儿,等 ...
- 深入刨析tomcat 之---第8篇 how tomcat works 第11章 11.9应用程序,自定义Filter,及注册
writed by 张艳涛, 标签:全网独一份, 自定义一个Filter 起因:在学习深入刨析tomcat的学习中,第11章,说了调用过滤链的原理,但没有给出实例来,自己经过分析,给出来了一个Filt ...
- 如何注册Filter
AX文件的一个对外接口DllRegisterServer,由外部调用,比如注册AX的时候:regsvr32 xxx.ax 通常情况下,我们的filter可能注册在"Direct ...
- filter 过滤器(监听)
Filter 过滤器 1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, ...
- [ASP.NET MVC 小牛之路]11 - Filter
Filter(筛选器)是基于AOP(面向方面编程)的设计,它的作用是对MVC框架处理客户端请求注入额外的逻辑,以非常简单优美的方式实现横切关注点(Cross-cutting Concerns).横切关 ...
- (1-1)文件结构的升级(Area和Filter知识总结) - ASP.NET从MVC5升级到MVC6
ASP.NET从MVC5升级到MVC6 总目录 MVC5项目结构 带有Areas和Filter的项目结构 一般来说,小的MVC项目是不考虑领域的,但是,如果是稍微复杂一点的项目,往往是需要领域这个概念 ...
- Java 中的 Filter 过滤器详解
Filter简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件 ...
- Filter(过滤器)学习
一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...
- Filter
一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有 web资源:例如Jsp, Servlet, 静 ...
随机推荐
- sphinx的再创造coreseek的安装过程
CoreSeek详细安装过程:coreseek-3.2.14.tar.gz下载链接: http://pan.baidu.com/s/1o6DNesE 解压缩安装mmseg分词程序: .tar.gz c ...
- python监控接口请求
#!/usr/bin/env python #coding=utf8 import time,os,sched,urllib,httplib import smtplib import string ...
- CF 246E. Blood Cousins Return [dsu on tree STL]
题意: 一个森林,求k级后代中多少种不同的权值 用set维护每个深度出现的权值 一开始一直在想删除怎么办,后来发现因为当前全局维护的东西里都是当前子树里的,如果要删除那么当前一定是轻儿子,直接清空se ...
- BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster [广义后缀自动机]
JZPGYZ - Sevenk Love Oimaster Oimaster and sevenk love each other. But recently,sevenk hea ...
- 关于node的基础理论,书上看来的
最近看了一本书,说了一些Node.js的东西,现在来记录一下,让自己记得更牢靠一点. 在书上,是这样介绍的:Node.js模型是源于Ruby的Event Machine 和 Python的Twiste ...
- Windows Server 2016-重命名域控制器
当公司发展到一定规模或者信息化建设到一定程度的情况下,很多信息化规范出台:很多初期服务器搭建包括服务搭建等计算机名等都是按照默认或者随机命名的,不便于区分业务或服务等.通过前边的章节我们对Active ...
- smallcorgi/Faster-RCNN_TF训练自己的数据
熟悉了github项目提供的训练测试后,可以来训练自己的数据了.本文只介绍改动最少的方法,只训练2个类, 即自己添加的类(如person)和 background,使用的数据格式为pascal_voc ...
- 阿里云学习之IOT物联网套件(配置篇)
文档时间:2018.-1-24 首注:此文章是参照以下文章的整合与补充: https://bbs.aliyun.com/read/309106.html?amp;displayMode=1&p ...
- linux server 常见参数修改
文件描述符(file descriptors) /etc/security/limits.conf 这里是当前用户允许打开的文件描述符限制,可以用ulimit -n查看. 修改成如下配置: * h ...
- redis —主从&&集群(CLUSTER)
REDIS主从配置 为了节省资源,本实验在一台机器进行.即,在一台机器上启动两个端口,模拟两台机器. 机器准备: [root@adailinux ~]# cp /etc/redis.conf /etc ...