既然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的更多相关文章

  1. spring-boot-2.0.3源码篇 - filter的注册,值得一看

    前言 开心一刻 过年女婿来岳父家走亲戚,当时小舅子主就问:姐夫,你什么时候能给我姐幸福,让我姐好好享受生活的美好.你们这辈子不准备买一套大点的房子吗?姐夫说:现在没钱啊!不过我有一个美丽可爱的女儿,等 ...

  2. 深入刨析tomcat 之---第8篇 how tomcat works 第11章 11.9应用程序,自定义Filter,及注册

    writed by 张艳涛, 标签:全网独一份, 自定义一个Filter 起因:在学习深入刨析tomcat的学习中,第11章,说了调用过滤链的原理,但没有给出实例来,自己经过分析,给出来了一个Filt ...

  3. 如何注册Filter

    AX文件的一个对外接口DllRegisterServer,由外部调用,比如注册AX的时候:regsvr32 xxx.ax       通常情况下,我们的filter可能注册在"Direct ...

  4. filter 过滤器(监听)

    Filter 过滤器 1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, ...

  5. [ASP.NET MVC 小牛之路]11 - Filter

    Filter(筛选器)是基于AOP(面向方面编程)的设计,它的作用是对MVC框架处理客户端请求注入额外的逻辑,以非常简单优美的方式实现横切关注点(Cross-cutting Concerns).横切关 ...

  6. (1-1)文件结构的升级(Area和Filter知识总结) - ASP.NET从MVC5升级到MVC6

    ASP.NET从MVC5升级到MVC6 总目录 MVC5项目结构 带有Areas和Filter的项目结构 一般来说,小的MVC项目是不考虑领域的,但是,如果是稍微复杂一点的项目,往往是需要领域这个概念 ...

  7. Java 中的 Filter 过滤器详解

    Filter简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件 ...

  8. Filter(过滤器)学习

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

  9. Filter

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有 web资源:例如Jsp, Servlet, 静 ...

随机推荐

  1. 安装Mercurial进行版本管理

    mercurial是又一个去中心化的版本管理软件,类似git 先介绍如何安装mercurial yum -y install mercurial mercurial需要一个用户名来记录commit动作 ...

  2. 安装php扩展phpredis

    下载phpredis-master.tar.gz下载地址:http://pan.baidu.com/s/1i37R8TB 解包tar zxvf phpredis-master.tar.gzcd php ...

  3. z3 巧解CTF逆向题

    z3 巧解逆向题 题目下载链接:http://reversing.kr/download.php?n=7 这次实验的题目为Reversing.kr网站中的一道题目. 题目要求: ReversingKr ...

  4. Android Studio 3.1 Beta 1发布,如何及时下载更新

    每次收到Android Studio更新提示,总是延迟一段时间才能下载的到或者更新成功.架梯子也不行.而且更新检测也是时断时续.Android Studio 3.0.1使用一段时间,多开几个工程.经常 ...

  5. BZOJ 1202: [HNOI2005]狡猾的商人 [带权并查集]

    题意: 给出m个区间和,询问是否有区间和和之前给出的矛盾 NOIp之前做过hdu3038..... 带权并查集维护到根的权值和,向左合并 #include <iostream> #incl ...

  6. OI常用读入方式效率测试

    我来填坑了. 这次我用自己写的测试读入的程序来分别测试cin(不关闭流同步),scanf和读入优化的效率差别.   我们分别对三个阶段的数据量n进行测试,通过时间比对来观察性能的差异. n = 102 ...

  7. BZOJ 2738: 矩阵乘法 [整体二分]

    给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 愚蠢的名字...... 整体二分,影响因子就是矩阵里的数 把$\le mid$的矩阵元素加到二维树状数组里然后询问分成两组就行 ...

  8. Validate Model State automatically in ASP.NET Core 2.0

    if (!ModelState.IsValid) { //TODO 模型验证失败需要做的事情 } 上面的代码不管是在传统的ASP.NET还是新一代ASP.NET Core中都是为了验证模型的状态是否合 ...

  9. 【Oracle】-初识PL/SQL

    在最近的工作中要用到存储过程和函数,索性把PL/SQL整体的看一下.之前看过基本书和园子里的博文,在这里将所学简单总结. 一.基本语句 1.大小写 2.分隔符  --  : 3.引用字符串  --   ...

  10. explorer.exe 该文件没有与之关联的程序来执行该操作

    删了点右键的东西搞出来的问题 其实就是关联出错了,解决:(新建一个temp.reg,内容如下,然后双击导入注册表即可) Windows Registry Editor Version 5.00 [[H ...