Linu下插件开发应用案例

上传人:z**** 文档编号:148368675 上传时间:2022-09-04 格式:DOCX 页数:13 大小:20.67KB
收藏 版权申诉 举报 下载
Linu下插件开发应用案例_第1页
第1页 / 共13页
Linu下插件开发应用案例_第2页
第2页 / 共13页
Linu下插件开发应用案例_第3页
第3页 / 共13页
资源描述:

《Linu下插件开发应用案例》由会员分享,可在线阅读,更多相关《Linu下插件开发应用案例(13页珍藏版)》请在装配图网上搜索。

1、Linux 下插件开发应用案例方汉在 Linux 上愈来愈多的应用程序利用 Plugin 编程技术来实现扩展功能,目前应用比较广泛的有 Gimp Netscape/Mozilla、XMMS和Nessus等,本文将简单介绍这些软件的Plugin的架构和编程。给软件以生命力的 Plugin众所周知,要让一个软件具有生命力,最重要的一点是要让它提供并支持越来越多的功能,而这一点单 凭开发者自身是很难独立做到的,需要让第三方的软件开发者可以通过作者提供的一种途径来为该软件添加 功能。最初,人们是使用关联模式,也就是像Windows下的文件扩展名一样,根据不同的文件关联,使用不同 的软件打开相应的文件。

2、这种方式编写扩展最为容易和自由,但是存在一定的缺陷,首先是不能利用宿主软 件的资源,其次是软件的界面风格不易统一、灵活性不好。后来出现了 Plugin结构,也就是利用动态连接库 的方式制作Plugin (在 Windows平台下是DLL、在Linux/Unix环境下是share object library), Plugin程序只能 依附于宿主程序运行,不能独立运行,使用 Plugin 的优点是系统开销小、速度快,同宿主程序结合紧密、灵 活性好。在 Linux 上,最著名的 Plugin 架构就是 Netscape 提出的 Plugin 架构,比较出名的还有 WinAmp ()(在Linux上

3、改名叫XMMS,网址为www.xmms.org),这个MP3播放软件中多彩多姿的 插件(Plugin)系统和皮肤(skin)系统为其一统天下做出了不可磨灭的贡献。现在WinAmp已开始提供一个 NSDN (Null Soft Develop Network)来让大家开发Plugin,由此可见Plugin对于一个软件来说是多么重要。Linux下插件安装在Linux上,使用某种软件的Plugin的方法很简单,一般该宿主软件都会提供一些缺省的Plugin,而且会 搜寻相应的 Plugin 目录,用户可以把 Plugin 安装到系统的 Plugin 目录下也可以安装到自己的目录下。比如, 要安装Net

4、scape的Plugin,可以设定$NPX_PLUGIN_PATH这个环境变量到你的新Plugin目录,或者把Plugin 安装到下列路径上:/usr/local/lib/netscape/Plugins$MOZILLA_HOME/Plugins$HOME/.netscape/PluginsNetscape会自动搜寻这些Plugin目录来自动加载相应的Plugin,其他的软件如Gimp、XMMS和Nessus 等的使用方法与此大同小异。最简单Plugin架构的实现首先,我们要编写一个宿主程序,该宿主程序必须为Plugin提供相应的接口,例如在本例子中的Action, 然后宿主程序可以通过dlo

5、pen来打开相应的Plugin,调用dlsym和createproc来创建Plugin的进程,最后还 要调用Plugin执行相应的动作,一切完成后要用dlclose来关闭Plugin。宿主程序的源代码如下:Plugin_main, h#ifndef _PLUG_MAIN_H_#define _PLUG_MAIN_H_/定义强制C类型以回避C+命名规范,这样我们就可以定义dlsym()#ifdef _cplusplusextern C #endifclass CPlugMainpublic:virtual int Action() = 0;/下面是Plugin的通用函数,每个Plugin都会重载

6、这个函数,主程序将创建惟一的子进程extern CPlugMain 囹CreatePlug();typedef CPlugMain 囹(囹CREATEPLUG_PROC)();#ifdef _cplusplus#endif /#define cplusplus#endif /#define _PLUG_MAIN_H_Plugin_main, cpp#include Plugin_main.h#include Vstdio.h#include Vdlfcn.h 动态链接库相关函数/下面将定义固定的Plugin名称,读者可以自行定义如同Windows注册表那样的Plugin注册系统#define

7、NUM_PLUGINS 2char0szPlugins =./Plugin1.so,./Plugin2.so;int main( int argc, char00 argv )CREATEPLUG_PROC createprocNUM_PLUGINS;CPlugMain0 pPlugins*NUM_PLUGINS+;void0 handle*NUM_PLUGINS+;char0 error;int i;/ 加载所有 Pluginfor ( i=0; iVNUM_PLUGINS; i+ )printf( 加载 Plugin %s. , szPluginsi );/ 加载 Plugin 动态链接库

8、if (NULL = (handlei = dlopen( szPluginsi, RTLD_LAZY )handlei = NULL;printf( dlopen error (%s) , szPluginsi );else/ 取得 CreatePlug 的地址createproci = (CREATEPLUG_PROC)dlsym( handlei, CreatePlug ); if (error = dlerror() != NULL)dlclose( handlei );handlei = NULL;printf( dlsym error (%s) , szPluginsi );els

9、e/ 创建 Plugin 进程pPluginsi = createproci();/ 执行 Plugin 的动作printf( 正在运行 Plugin . );for ( i=0; iVNUM_PLUGINS; i+ )if (handlei != NULL)pPluginsi-Action();/ 关闭 Pluginfor ( i=0; iVNUM_PLUGINS; i+ )if (handlei != NULL)dlclose( handlei );handlei = NULL;return 0;下面是一个最简单的Plugin,只包含了 Plugin_main.h这个头文件,并且实现Act

10、ion和CreatePlug这两个 函数。源程序如下:Plugin_1. h# ifndef _PLUGIN_1_H_#define _PLUGIN_1_H_# include “ Plugin_main. hclass CPlugin10 public CPlugMain0public0virtual int Action0 000#endif / /#define _PLUGIN_1_HPlugin_1. cpp# include Plugin_main. h# include “ Plugin1. h# include Vstdio. hprintf( 这是 Plugin 1,运行正常

11、);return 0;CPIugMain 囹 CreatePlug()return new CPIugin1;值得注意的是,编译这个Plugin的时候要使用-shared参数来产生动态链接库.so文件,例如:gcc -oPIugin1.so PIugin1.o -shared。Plugin 开发实战我们来看看如何为现有的一些软件编写Plugin,其中最复杂的是Netscape 4.x和Mozilla (Netscape 6.x) 的Plugin编写工作,而Xmms/Gimp/Nessus的Plugin相对来说要容易编写得多。1 Netscape 4x / Mozilla 的 Plugin 结构

12、Netscape的Plugin结构相对比较古老,Netscape提供的接口包括NPP系列和NPN系列,其中NPP系列 中 Plugin 必须自行实现,包括: NPP_Destroy、NPP_DestroyStream、NPP_GetJavaClass、NPP_HandleEvent、NPP_Initialize、NPP_New、NPP_NewStream、NPP_Print、 NPP_SetWindow、NPP_Shutdown、NPP_StreamAsFile、NPP_URLNotify、NPP_Write 和 NPP_WriteReady。NPN系列是Plugin要求Netscape提供的

13、一些函数,包括:NPN_DestroyStream、NPN_GetJavaEnv、 NPN_GetJavaPeer、 NPN_GetURL、NPN_MemAlloc、 NPN_MemFlush、 NPN_MemFree、NPN_NewStream、NPN_PostURL、NPN_RequestRead、NPN_Status、 NPN_UserAgent、 NPN_Version 和 NPN_Write。每种Plugin都有两种工作模式,即嵌入式和全页面方式,Plugin需要实现的工作包括以下内容:(1) 登记一种或几种Plugin要操作的MIME格式;(2) 在浏览器的窗口中间绘图;( 3)接

14、收鼠标/键盘输入;(4)从相应的 URL 中下载/发送数据。用户如果要开发 Netscape 的 Plugin,首先要在 ftp:/下载相应的SDK文件,里面有简单的例子,用户可以自行修改成自己的Plugin。Mozilla/Netscape 6.x的Plugin架构是目前最先进的一种,它主要有下列优点:(1) 提供基于C+的API函数;(2) 提供了 XPCOM,它是 COM (the Component Object Model)的一个子集,XP 的意思是 cross-platform (跨平台),这使得新的 Plugin 的跨平台性和不同版本的兼容性得到了极大的提高;(3) 完全向后兼容

15、,所有老的 4.x 系列的 Netscape Plugin 都可以继续使用。Mozilla 的 Plugin架构将原来的 NPP 系列接口改变为:NPIPIugin、NPIPluginInstance和 NPIPIuginStream 三 个类; NPN 系列接口被扩充为 NPIPluginManager、 NPIPluginManagerStream、 NPIPluginInstancePeer 和 NPIPluginStreamPeer四个类,其中NP的意思是Netscape Plugin,I的意思是Interface。linux 插件开发参考文献 xmms 插件开发指南: http:/w

16、ww.xmms.orggimp 插件开发指南: http:/www.gimp.org/plugin_devel.htmlnessus 插件开发指南: http:/www.nessus.org/doc/plugins_api.txthttp:/www.nessus.org/doc/nasl.htmlnetscape 4x 系列插件开发指南:communicator/plugin/index.htmftp:/mozilla囹netscape 6. x系列插件开发指南:http:/www.mozilla.org/docs/plugin.htmlhttp:/www.mozilla.org/docs/e

17、xtendmoz.html要开发Mozilla的Plugin,用户需要下载Mozilla的源代码,而Plugin的例子程序可以在 http:/lxr.mozilla.org/mozilla/source/Plugin/ 上查阅,具体文档请参阅附录。2. Xmms 的 Plugin 架构Xmms 的 Plugin 分为输入(Input )、输出(Output)、可视化(Visualization)、通用(General)、效果(Effect) 和其他(Misc)五种,要开发Xmms的Plugin需要安装xmms-devel这个软件包,下面是一个最简单的Xmms 可视化的 Plugin:xmmsP

18、lugin. c#include Vgtk/gtk.h#include xmms/Plugin.hstatic GtkWidget 囹window = NULL,囹button;static void Plugin_init(void);static void Plugin_cleanup(void);VisPlugin Plugin_vp =NULL,NULL,0,NULL,個描述函数0/0,1,Plugin_init, /0 初始化函数 0/Plugin_cleanup, /0 结束函数 0/NULL, /0 关于函数 0/NULL, /0 配置函数 0/NULL, /0 disable_

19、Plugin 0/NULL, /0 playback_start 0/NULL, /0 playback_stop 0/NULL, /0 render_pcm 0/NULL /0 render_freq 0/;VisPlugin 0get_vPlugin_info(void)Plugin_vp.description =g_strdup_printf(Hello World!);return &Plugin_vp;#define WIDTH 250#define HEIGHT 100static void Plugin_destroy_cb(GtkWidget 囹w,gpointer data

20、)Plugin_vp.disable_Plugin(&Plugin_vp);static void Plugin_init(void)if(window)return;window = gtk_window_new(GTK_WINDOW_DIALOG);gtk_window_set_title(GTK_WINDOW(window),Hello World);gtk_window_set_policy(GTK_WINDOW(window), FALSE, FALSE, FALSE);gtk_widget_realize(window);gtk_widget_set_usize(window, W

21、IDTH, HEIGHT);button = gtk_button_new_with_label (Hello World);gtk_container_add (GTK_CONTAINER (window), button);gtk_widget_show(button);gtk_widget_show(window);static void Plugin_cleanup(void)if (window)gtk_widget_destroyHwindow 囹3. Gimp 的 Plugin 架构Gimp 的 Plugin 结构比较特殊,使用了宏定义来实现 Plugin 接口。MAIN()宏调

22、用gimp_main、使得Plugin可以被Gimp调用,Gimp的Plugin接口比较简单,在gimp启动 时将查询所有的Plugin并注册到一个PDB (procedural database)中,每个Plugin只需要实现下面的结构:typedef void 個 GimpInitProc) (void);typedef void 個 GimpQuitProc) (void);typedef void 個 GimpQueryProc) (void);typedef void 個 GimpRunProc) (gchar 囹name,gint nparams,GimpParam 囹param,

23、gint 囹nreturn_vals,GimpParam 00return_vals);struct _GimpPluginInfo個Plugin初始化函数0/GimpInitProc init_proc;/0 Plugin 推出函数 0/GimpQuitProc quit_proc;/0告知宿主程序本Plugin的功能,执行注册到PDB的功能0/GimpQueryProc query_proc;個 实现Plugin的功能0/GimpRunProc run_proc;000000000000000000000000000000000000000000000000Gimp 的 Plugin 就是通过上面的四个函数来实现的。关于Linux下面的Plugin的使用和编程就介绍到这里,其中Netscape/Mozilla的Plugin编程最为复杂,不过对有一定编程经验的用户来说,好好研究一下 Mozilla 的 Plugin 编程是会很有好处的。本文的所有例子程序都在 Linux-Plugin-Example.zip 中,用户可以到 http:/opencjk.org/Linux-Plugin-Example.zip网址自行下载。所有程序均在RedHat 7.0、gcc-2.96、glibc-2.1.92下编译通过。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!