我的玻璃盒子

【原创】我的Firefox插件开发之旅(6)——FF插件的一些基础知识

上篇文章学习了npruntime的例子程序,接下来迫不及待地想实现自己的一个插件了。我决定使用VS 2005来做。

新建了一个名为npgnet的工程,按照npruntime例子,新建了np_entry.cpp、npn_gate.cpp、npp_gate.cpp、npgnet.def四个文件,然后新建了一个类CGnetFFPlugin,并且把例子中的关键代码添加了进来(我删除了一些cplugin类中的函数实体代码,因为我实现的功能和例子中的无关)。编译后,将生成的npgnet.dll放到FF的plugins目录下,然后在地址栏键入about:plugins,我靠,竟然没有我的插件!怎么回事?三个导出函数我都按照标准写了啊?比较了一下文件,我的工程没有添加.rc和resource.h,可能是这个原因。

回到VS 2005,在资源面板添加了一个VERSION资源项,修改ProductName等资源项以后,和npruntime例子比较了一下,还差MIMEType。这个东东很重要,这个给我的感觉就是FF插件的身份证,FF就是靠这个东东来匹配和识别你的插件的。但是我不知道VS 2005中怎么添加一个VERSION的键值,所以我只好用EditPlus打开npgnet.rc,手动添加了MIMEType:application/mozilla-npgnet-scriptable-plugin。OK,现在.rc和resource.h都欧了,再编译,将生成的npgnet.dll放到FF的plugins目录下,然后在地址栏键入about:plugins,我靠,竟然还是没有我的插件!真费解啊!

头大……接下来我进行了一系列的代码比较和尝试,失败了N多次,这里就省略不说了。最后发现原因原来在这个.rc上面。我的这个.rc是在VS 2005中使用菜单命令添加的,默认语言是简体中文,而npruntime例子是英文,用文件比较工具比较了一下,codepage和部分代码的位置都不太一样。其实只要把npruntime的这个.rc文件替换我的这个,然后编译输出的dll,FF就可以识别了!究竟是什么原因呢?是我的.rc缺少了些什么东西?还是FF只能识别英文的.rc?先不打算研究那么多了,至少我的插件的关键点不在这个上面,后面我还有很多事情需要去做。只要能让FF认出来,那就好。

既然决定要写插件,就要先理解插件的概念,在这个页面上有很详细的介绍:https://developer.mozilla.org/en/Gecko_Plugin_API_Reference/Plug-in_Basics

下面的文字是我的一些阅读笔记和体会:

一、插件的加载过程

当一个页面打开时,如果该页面上有嵌入一个插件,浏览器将会做以下事情:

  • 通过MIMEType检查是否有匹配插件
  • 加载插件代码到内存
  • 初始化插件
  • 创建一个新的插件实例

插件可以在一个页面上被实例多个对象,也可以在同一时刻在不同的窗口中被实例化。当页面被关闭时,插件的实例就会被销毁。当最后一个实例被删除后,插件代码就会从内存中被卸载掉。

下面是插件内的函数调用过程:

  • 如果插件是首次被载入内存,浏览器会调用插件的NP_Initialize方法。为了方便起见,所有的插件定义函数以“NPP”开头,所有的浏览器定义函数以“NPN”开头。
  • 当浏览器创建插件实例时,会调用NPP_New方法。
  • 当插件实例被删除时(如关闭页面、关闭窗口),会调用NPP_Destroy方法。
  • 当最后一个实例被删除,插件从内存中卸载时,会调用NP_Shutdown方法。

二、插件检测

可以使用Javascript来检测一个插件是不是已经安装了,下面是测试代码:
function DetectFFPlugin()
{
    var mimetype = navigator.mimeTypes["application/mozilla-npgnet-scriptable-plugin"];
    if(mimetype)
    {
        var plugin = mimetype.enabledPlugin;
        if(plugin)
        {
            document.writeln("Plugin had been installed and be enabled.");
        }
    }
    else
    {
        document.writeln("Sorry, Plugin has NOT been installed.");
    }
}

嗯,看到这里,觉得这个检测很有用。当检测用户尚未安装时,可以指导用户到哪哪哪去下载安装(转向一个漂亮点儿的页面),当检测已经安装了,就动态加载插件代码。不错。:)

三、插件结构概述

一个插件中的方法分为插件方法(Plug-in Methods)和浏览器方法(Browser Methods)。插件方法是你在插件中自己去执行的那些方法,以NPP为前缀命名。浏览器方法是被Gecko所执行的那些方法,以NPN为前缀命名。数据结构(Data Structures)以NP开头。

插件可分为有窗口和无窗口两种,不过文章中建议使用有窗口的,说这样会更稳定和易于控制。另外文中提到了可以将插件作为页面的一部分,并且可以使用HTML代码来控制插件的显示与否。

有两种方式可以使一个插件不可见:

1、如果你使用embed标签,可以使用其hidden属性,例如:<embed src="audiplay.aiff" type="audio/x-aiff" hidden="true">
2、如果你是用object标签,由于它没有hidden属性,你可以用CSS来完成隐藏:

object
{
    visibility: visible;
}
object.hiddenObject
{
    visibility: hidden !important;
    width: 0px  !important;
    height: 0px  !important;
    margin: 0px  !important;
    padding: 0px  !important;
    border-style: none  !important;
    border-width: 0px  !important;
    max-width: 0px  !important;
    max-height: 0px  !important;
}

<object data="audiplay.aiff" type="audio/x-aiff" class="hiddenObject"></object>

接下来文中介绍了object这个标签的使用。并且给了一个例子来说明ActiveX和插件如何融为一体来使用。

最后面的部分是对object和embed两种标签的各种属性的说明和举例。

值得一提的是,对于object和embed两种标签都可以在页面上嵌入一个插件。如何取舍呢?文章中有这么一段话:

Though the object element is the preferred way to invoke plug-ins, the embed element can be used for backward compatibility with Netscape 4.x browsers, and in cases where you specifically want to prompt the user to install a plug-in, because the default plug-in is only automatically invoked when you use the embed element.

意思是说:尽管object是推荐使用的调用插件的方式,embed也可嵌入插件(Netscape 4.x以上的浏览器),但如果你想在用户没有安装插件时,提示他进行安装,那么就应该选择用embed,因为FF的默认插件系统仅仅在你使用embed标签的时候,才会自动帮助你完成这种提示用户安装的效果。

我看过以后的感觉是,object使用起来似乎比embed要复杂,起码针对FF这个浏览器是这样,虽然他是HTML W3C的标准。多数情况下使用embed就可以了,何况现在谁还在用Netscape 4.x以下版本的浏览器啊,您说是不是?:)

OK,通过这几天的学习,终于对FF的插件编写有了一个初步的感性认识。到目前为之一切还比较顺利。

posted on 2008-11-12 14:40 深蓝色系统 阅读(13814) 评论(13)  编辑 收藏 引用 所属分类: Firefox开发

评论

# re: 我的Firefox插件开发之旅(6)&mdash;&mdash;FF插件的一些基础知识 2009-04-23 14:47 mycode

写得很好,支持一下。  回复  更多评论   

# re: 【原创】我的Firefox插件开发之旅(6)&mdash;&mdash;FF插件的一些基础知识 2009-09-19 02:35 suntofly

你还真是挺勤劳的,今天看到这, mark一下..

最后一句话写的有点复杂, 说的简单点应该是考虑到和ie的兼容问题,还是用object套embed比较好.可以参考这个:
http://www.xpb.cn/blog/273.html  回复  更多评论   

# re: 【原创】我的Firefox插件开发之旅(6)&mdash;&mdash;FF插件的一些基础知识 2009-09-24 15:45 433

中国人都喜欢把外国搞出来的东西理解了50%,然后在不懂的人面前装成这个领域的行家  回复  更多评论   

# re: 【原创】我的Firefox插件开发之旅(6)&mdash;&mdash;FF插件的一些基础知识 2009-09-25 10:00 深蓝色系统

回复楼上的:
您是批评我装行家么?我哪里说我是FF插件开发的行家了?
写关于FF插件开发的这几篇文章,完全是因为去年要为公司开发一个FF插件,当时也是从零开始学习。这几篇文章只是记录自己的学习经历罢了,又不是教程。而且我只是写在自己的blog中以备今后查阅所用,既没有发布到cppblog推荐区,也没有四处宣传。

中国有句俗话:万事开头难。我当初学习FF插件开发,也是遇到很多问题。但通过找资料,基本上都解决了。如果您说我理解50%,我觉得您高估我了,其实我只理解了20%。但这就足够了,足够我完成我的工作任务了。
  回复  更多评论   

# re: 【原创】我的Firefox插件开发之旅(6)&mdash;&mdash;FF插件的一些基础知识 2009-10-20 17:40 tt

@深蓝色系统
我支持楼主。能解决问题就是好事,我们需要的是解决问题,而不是做学问,做研究。  回复  更多评论   

# re: 【原创】我的Firefox插件开发之旅(6)&mdash;&mdash;FF插件的一些基础知识 2009-11-13 11:59 白开水

@433

别人即使装行家,也贡献了不少知识,请问兄弟你又贡献了什么呢?  回复  更多评论   

# re: 【原创】我的Firefox插件开发之旅(6)&mdash;&mdash;FF插件的一些基础知识 2009-11-16 12:11 Free梦

支持作者。
记得我当时写NT设备驱动程序的时候,把Help(那个时候市面上还没有NT的资料,所以这个Help也是英文原版的了)看了两个星期,对于NT其它内容一点也没有看,花了两个星期就把板卡设备驱动写出来了。写完之后也是对于NT了解不到10%。  回复  更多评论   

# re: 【原创】我的Firefox插件开发之旅(6)&mdash;&mdash;FF插件的一些基础知识 2009-12-07 11:05 chow

楼主啊,最近因为工作关系也在开发FF的插件,对windowed-plugin 和windowless-plugin他们之间的区别很是不能理解啊。能说说你的看法么
这个是原文的地址:http://web.archive.org/web/20040212183137/http://developer.netscape.com/docs/manuals/communicator/plugin/index.htm  回复  更多评论   

# re: 【原创】我的Firefox插件开发之旅(6)&mdash;&mdash;FF插件的一些基础知识 2009-12-18 13:50 smh_mouse

回复:深蓝色系统
不管怎么样,人家把自己的东西贡献出来,共享出来,帮助了很多的初学者,无论从精神层面还是从实际效果上看都是值得肯定的。
有本事你也把你的东西共享出来。  回复  更多评论   

# re: 【原创】我的Firefox插件开发之旅(6)&mdash;&mdash;FF插件的一些基础知识 2010-09-16 14:23 张三李四

你可能是那种极渴望成为行家,但偏偏是连装都不会的那种人,其实这种人不少,但其中有你这样的嫉妒心理就不多了。

人家是行家就是因为你不懂!  回复  更多评论   

# re: 【原创】我的Firefox插件开发之旅(6)&mdash;&mdash;FF插件的一些基础知识 2010-09-16 15:06 张三李四

@433:

你可能是那种极渴望成为行家,但偏偏是连装都不会的那种人,其实这种人不少,但其中有你这样的嫉妒心理就不多了。

人家是行家就是因为你不懂!

支持作者!
  回复  更多评论   

# re: 【原创】我的Firefox插件开发之旅(6)&mdash;&mdash;FF插件的一些基础知识[未登录] 2011-11-25 14:41 wang

请问一下,要自己从一个空项目开始,哪些代码是必需的,哪些是自己添加的能否详细说明一下,比如直接写个helloworld的插件,谢谢!  回复  更多评论   

# re: 【原创】我的Firefox插件开发之旅(6)&mdash;&mdash;FF插件的一些基础知识 2014-03-26 10:32 初来刚到

支持作者分享自己的学习体验!  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2016年6月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

统计

常用链接

留言簿(75)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜