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)。

时间: 2024-11-03 08:57:14

Filter的注册2的相关文章

如何注册Filter

AX文件的一个对外接口DllRegisterServer,由外部调用,比如注册AX的时候:regsvr32 xxx.ax        通常情况下,我们的filter可能注册在"Direct Show"目录下,那么直接调用       // Creates registry entries for the DLLSTDAPIDllRegisterServer(){return AMovieDllRegisterServer2(TRUE);} AMovieDllRegisterServe

DirectShow中写push模式的source filter流程 + 源代码(内附详细注释)

虽然网上已有很多关于DirectShow写source filter的资料,不过很多刚开始学的朋友总说讲的不是很清楚(可能其中作者省略了许多他认为简 单的过程),读者总希望看到象第一步怎么做,第二步怎么做....这样的demo.其实写你的第一个filter是有一定难度的,只要过了这关以后 就容易多了.由于最近需要自己写一个push推模式的source filter,加上刚激活了Blog,不好意思Blog上没有一篇文章,所以将写这个filter的过程写下来 ,为了照顾刚开始学的朋友,我采用第一步第

Filter描述

看到一篇写Filter很好的文章,转载一下: http://tianweili.github.io/blog/2015/01/26/java-filter/ 以下文字全部复制于上面链接. 本文主要详细介绍了Filter的以下几个方面内容: Filter概念介绍 Filter的用途 如何借助Filter实现拦截功能 Filter的开发步骤和配置详解 Filter链 Filter的生命周期 Filter的使用案例 使用Filter验证用户登录安全控制 防止中文乱码过滤器 Spring+Hiberna

Java中的Filter过滤器详解

Filter简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. 它主要用于对用户请求进行预处理,也可以对HttpServletResponse 进行后处理.使用Filter 的完整流程:Filter 对用户请求进行预处理,接着将

【视频处理工程】2、DirectShow的基本单元:Filter

概念 DirectShow所采用的是一种模块化的结构,其基本单元是一类成为filter的COM对象.DirectShow提供了多种预定义的标准filter组件,同时开发者也可以根据需要开发自己的个性化filter.常用的filter一般可分为以下不同类别: (1)Source Filter--为整个Filter Graph提供数据来源,这些数据可能来自硬盘文件.网络流媒体或者音视频采集设备等.不同的数据来源由不同的Source Filter负责处理. (2)Transform Filter--负

Java Web Filter 过滤器学习教程(推荐)_java

一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.通过F

EXTJS4 Grid Filter 插件的使用 与后台数据解析------Extjs 查询筛选功能的实现

  先汗一个,一个小功能又踢腾了一天.本来这个带Demo的,但是上面介绍的不是很详细.用的时候问题不大,主要问题在文件导入方面.以为这个插件的使用和其他的不一样. 1.首先是需要引入文件的位置:如图 需要把整个grid都考到vs下,vs中结构如下: 2.设置路径,将文件导入 Ext.Loader.setConfig({ enabled: true }); Ext.Loader.setPath('Ext.ux', '../ext-js4.2/ux'); Ext.require([ '*', 'Ex

开发Windows 2000/XP下的防火墙

开发Windows 2000/XP下的防火墙-windowsxp防火墙">介绍 如果你决定开发LINUX下的防火墙,你会找到很多免费的信息与源代码.但如果开发WINDOWS平台下的防火墙会有点困难,找到相关信息与代码都简直是不可能的任务. 因此我决定写这篇文章介绍在WINDOWS 2000/XP下开发防火墙的简单方法. 背景 在WINDOWS 2000 DDK中,微软包含了称为Filter-Hook Driver的新型网络驱动.你可以使用它来过滤所有进出接口的数据. 因为关于此的文档很少并

web.xml学习(3)_filter

Filter介绍 Filter可认为是Servlet的一种"变种",它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链.它与Servlet的区别在于:它不能直接向用户生成响应.完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理. Filter有如下几个用处. 在HttpServletRequest到达Servlet之前,拦截客户的HttpServ