Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14497990
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:58:19

下载本文示例代码
  学习directshow已经有几天了,下面将自己的学习心得写下来,希望对其他的人有帮助。 Filter实质是个COM组件,所以学习开发Filter之前你应该对com的知识有点了解。Com组件的实质是一个实现了纯虚指针接口的C 对象。关于com的东西,这里不多讲。   一 给vc配置DirectShow的开发环境  无论开发Filter还是开发Dshow的应用程序都要配置一下开发环境的,其实就是包含一下dshow用到的头文件和动态库。 选择Tools菜单下面的Options。在弹出的Option对话框配置如下 图1 添加头文件  选择动态库文件添加到工程中 图2 添加动态库  二 创建工程以及Filter的入口函数  创建工程  一般情况下,创建Filter使用一个普通的Win32 DLL项目。而且,一般Filter项目不使用MFC。这时,应用程序通过CoCreateInstance函数Filter实例; Filter与应用程序在二进制级别的协作。另外一种方法,也可以在MFC的应用程序项目中创建Filter。  在vc里新建一个工程,选择win32动态库,如下图 图3 图4   这样生成了一个简单的DLL,只有一个Dllmain入口函数。  下面我要给这个filter添加入口函数了。  Filter是个基于DLL的com组件,所以一般的Filter都要实现下面几个入口函数 DllMain DllGetClassObject DllCanUnloadNow DllRegisterServer DllUnregisterServer  首先定义导出函数  要导出这些函数有两种方法,一是在定义函数时使用导出关键字_declspec(dllexport),另外一种方法是在创建DLL文件时使用模块定义文件.Def。使用导出函数关键字_declspec(dllexport)创建MyDll.dll就是在 .h文件中定义定义函数如下: extern "C" _declspec(dllexport)BOOL DllRegisterServer;   为了用.def文件创建DLL,往该工程中加入一个文本文件,命名为MyDll.def,再在该文件中加入如下代码: LIBRARY MyFilter.ax EXPORTSDllMain PRIVATEDllGetClassObject PRIVATEDllCanUnloadNow PRIVATEDllRegisterServer PRIVATEDllUnregisterServer PRIVATE  其中LIBRARY语句说明该def文件是属于相应DLL的,EXPORTS语句下列出要导出的函数名称。我们可以在.def文件中的导出函数后加@n,如Max@1,Min@2,表示要导出的函数顺序号,在进行显式连时可以用到它。该DLL编译成功后,打开工程中的Debug目录,同样也会看到MyDll.dll和MyDll.lib文件。  然后要定义这些函数的实现了,其实这些工作dshow的基类里都已经替我们做好了,我们所要做的就拿来用就是了,最重要的三个函数的实现一般如下  STDAPI DllRegisterServer(){ return AMovieDllRegisterServer2(TRUE);}STDAPI DllUnregisterServer(){ return AMovieDllRegisterServer2(FALSE);} extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved){ return DllEntryPoint((HINSTANCE)(hModule), dwReason, lpReserved);}  其中DllEntryPoint 是在C:\DX90SDK\Samples\C \DirectShow\BaseClasses\dllentry.cpp定义的,如果感兴趣我们可以去看看它的定义。 AMovieDllRegisterServer2函数是在下面 C:\DX90SDK\Samples\C \DirectShow\BaseClasses\dllsetup.cpp这个文件定义的,具体实现可以自己看看。  到了这里你恐怕要做点工作,还是要设置一下你的项目环境,否则恐怕你编译是通不过的,因为你用到了基类的一些东西,所以你要将你的dshow基类的定义和库文件包含进来。首先包含#include Streams.h   其次在Project –Setting菜单下配置自己的Filter输出的名字和连接的lib文件 图5   其中library modules里的包含的动态库如下c:\DX90SDK\Samples\C \DirectShow\BaseClasses\debug\strmbasd.lib msvcrtd.lib quartz.lib vfw32.lib winmm.lib kernel32.lib advapi32.lib version.lib largeint.lib user32.lib gdi32.lib comctl32.lib ole32.lib olepro32.lib oleaut32.lib uuid.lib此时你编译一下,好像还是通不过,它提示有一个全局的用于实现COM接口的变量没有定义,不着急,下面我们就开始实现Filter的com接口。共3页。 1 2 3 :   学习directshow已经有几天了,下面将自己的学习心得写下来,希望对其他的人有帮助。 Filter实质是个COM组件,所以学习开发Filter之前你应该对com的知识有点了解。Com组件的实质是一个实现了纯虚指针接口的C 对象。关于com的东西,这里不多讲。   一 给vc配置DirectShow的开发环境  无论开发Filter还是开发Dshow的应用程序都要配置一下开发环境的,其实就是包含一下dshow用到的头文件和动态库。 选择Tools菜单下面的Options。在弹出的Option对话框配置如下 图1 添加头文件  选择动态库文件添加到工程中 图2 添加动态库  二 创建工程以及Filter的入口函数  创建工程  一般情况下,创建Filter使用一个普通的Win32 DLL项目。而且,一般Filter项目不使用MFC。这时,应用程序通过CoCreateInstance函数Filter实例; Filter与应用程序在二进制级别的协作。另外一种方法,也可以在MFC的应用程序项目中创建Filter。  在vc里新建一个工程,选择win32动态库,如下图 图3 图4   这样生成了一个简单的DLL,只有一个Dllmain入口函数。  下面我要给这个filter添加入口函数了。  Filter是个基于DLL的com组件,所以一般的Filter都要实现下面几个入口函数 DllMain DllGetClassObject DllCanUnloadNow DllRegisterServer DllUnregisterServer  首先定义导出函数  要导出这些函数有两种方法,一是在定义函数时使用导出关键字_declspec(dllexport),另外一种方法是在创建DLL文件时使用模块定义文件.Def。使用导出函数关键字_declspec(dllexport)创建MyDll.dll就是在 .h文件中定义定义函数如下: extern "C" _declspec(dllexport)BOOL DllRegisterServer;   为了用.def文件创建DLL,往该工程中加入一个文本文件,命名为MyDll.def,再在该文件中加入如下代码: LIBRARY MyFilter.ax EXPORTSDllMain PRIVATEDllGetClassObject PRIVATEDllCanUnloadNow PRIVATEDllRegisterServer PRIVATEDllUnregisterServer PRIVATE  其中LIBRARY语句说明该def文件是属于相应DLL的,EXPORTS语句下列出要导出的函数名称。我们可以在.def文件中的导出函数后加@n,如Max@1,Min@2,表示要导出的函数顺序号,在进行显式连时可以用到它。该DLL编译成功后,打开工程中的Debug目录,同样也会看到MyDll.dll和MyDll.lib文件。  然后要定义这些函数的实现了,其实这些工作dshow的基类里都已经替我们做好了,我们所要做的就拿来用就是了,最重要的三个函数的实现一般如下  STDAPI DllRegisterServer(){ return AMovieDllRegisterServer2(TRUE);}STDAPI DllUnregisterServer(){ return AMovieDllRegisterServer2(FALSE);} extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved){ return DllEntryPoint((HINSTANCE)(hModule), dwReason, lpReserved);}  其中DllEntryPoint 是在C:\DX90SDK\Samples\C \DirectShow\BaseClasses\dllentry.cpp定义的,如果感兴趣我们可以去看看它的定义。 AMovieDllRegisterServer2函数是在下面 C:\DX90SDK\Samples\C \DirectShow\BaseClasses\dllsetup.cpp这个文件定义的,具体实现可以自己看看。  到了这里你恐怕要做点工作,还是要设置一下你的项目环境,否则恐怕你编译是通不过的,因为你用到了基类的一些东西,所以你要将你的dshow基类的定义和库文件包含进来。首先包含#include Streams.h   其次在Project –Setting菜单下配置自己的Filter输出的名字和连接的lib文件 图5   其中library modules里的包含的动态库如下c:\DX90SDK\Samples\C \DirectShow\BaseClasses\debug\strmbasd.lib msvcrtd.lib quartz.lib vfw32.lib winmm.lib kernel32.lib advapi32.lib version.lib largeint.lib user32.lib gdi32.lib comctl32.lib ole32.lib olepro32.lib oleaut32.lib uuid.lib此时你编译一下,好像还是通不过,它提示有一个全局的用于实现COM接口的变量没有定义,不着急,下面我们就开始实现Filter的com接口。共3页。 1 2 3 : 下载本文示例代码


利用DirectShow开发自己的Filter利用DirectShow开发自己的Filter利用DirectShow开发自己的Filter利用DirectShow开发自己的Filter利用DirectShow开发自己的Filter利用DirectShow开发自己的Filter利用DirectShow开发自己的Filter利用DirectShow开发自己的Filter利用DirectShow开发自己的Filter利用DirectShow开发自己的Filter利用DirectShow开发自己的Filter利用DirectShow开发自己的Filter利用DirectShow开发自己的Filter利用DirectShow开发自己的Filter利用DirectShow开发自己的Filter
阅读(161) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~