• Filter的注册2 分类: DirectX 2014-09-22 17:41 451人阅读 评论(0) 收藏


      既然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 _ AudioInputDeviceCategoryMERIT_DO_NOT_USE
    Audio Compressors CLSID_AudioCompressorCategoryMERIT_ DO_ NOT_USE
    Audio Renderers CLSID_AudioRendererCategoryMERIT_ NORMAL
    DirectShow Filters CLSID_LegacyAmFilterCategoryMERIT_NORMAL
    Midi Renderers CLSID_ MidiRendererCategoryMERIT NORMAL
    Video Capture SourcesCLSID_ VideoInputDeviceCategoryMERIT DO_NOT_USE
    Video CompressorsCLSID_videoCompressorCategoryMERIT 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 DevicesAM_KSCATEGORYCAPTUREMERIT DO_NOT_USE
    WDM Streaming Crossbar DevicesAM_KSCATEGORY_ CROSSBARMERIT DO_NOT_USE
    WDM Streaming TV Audio DevicesAM_KSCATEGORY_TVAUDIOMERIT DO_NOT_USE
    WDM Streaming TV Tuner DevicesAM_KSCATEGORY_TVTUNERMERIT DO_NOT_USE


    提示:可以在注册表的KEY_CLASSES_ROOT/CLSlD/CLSlD_ActiveMovieCategories/instance下找到系统中注册的所有Filter类型目录。除了DirectShow使用的标准类型目录外,也可以创建自己的类型目录,只需将自定义的类型目录的CLSID在上述位置进行注册即可。在注册表中看到的CLSlD_ActiveMovieCategofies的GUID字符串,实际为{da4e3da0-d07d-11d0-bd50—00a0c91lce86)。

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Java中的String为什么是不可变的? -- String源码分析
    理解值和对象-快照图
    线程Thread
    Spring Cloud中,如何解决Feign/Ribbon第一次请求失败的问题?
    不要做一个浮躁的程序员
    关于在springboot中利用@Value注解读取配置文件中的属性值得问题
    Intellij Idea expired
    javascript事件之:谈谈自定义事件
    javascript事件之: 事件冒泡, 事件捕获 ,阻止默认事件
    windows7自带远程连接工具连接不上远程,只有windows服务器版本能连接tsmmc能连接的问题
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706513.html
Copyright © 2020-2023  润新知