npapi 火狐插件开发-基础篇

来源:互联网 发布:黄轩和蒋雯丽 知乎 编辑:程序博客网 时间:2024/05/16 14:47

本人由于公司项目的需要,需一个火狐插件,由于以前有C++的基础,就抱着试试看的心态,开始了火狐插件的开发之旅!

我这里面涉及的技术有:js调用插件函数,插件回调js函数

开始准备:VS2005,火狐4.0sdk (下载地址) ,由于我的这个插件要支持4.0,所以就用到这个SDK了。


一、js调用插件函数

首先在plugin.cpp文件中定义全局变量:

static NPIdentifier sfmOpenDevice_id; //打开设备
static NPIdentifier sfmCloseDevice_id; //关闭设备


然后在CPlugin构造函数中赋值:

CPlugin::CPlugin(NPP pNPInstance) :  m_pNPInstance(pNPInstance),  m_pNPStream(NULL),  m_bInitialized(false),  m_pScriptableObject(NULL)
{

..........

sfmOpenDevice_id = NPN_GetStringIdentifier("ON_OpenDevice");// ON_OpenDevice为插件函数名称,可以被js直接调用
sfmCloseDevice_id = NPN_GetStringIdentifier("ON_CloseDevice");

..........

}


然后加入下面代码:

bool ScriptablePluginObject::HasMethod(NPIdentifier name)
{
return (name == sfmOpenDevice_id ||
name == sfmCloseDevice_id )

}

最后:

bool ScriptablePluginObject::Invoke(NPIdentifier name, const NPVariant *args,uint32_t argCount, NPVariant *result)
{
CPlugin *plugin=(CPlugin *)mNpp->pdata;
if(name == sfmOpenDevice_id)//打开设备
{
int nRes =  1;// plugin->OnOpendev();
INT32_TO_NPVARIANT(nRes, *result);
return true;
}
else if(name == sfmCloseDevice_id)//关闭设备
{
int nRes = 2;//plugin->OnClosedev();
INT32_TO_NPVARIANT(nRes, *result);
return true;
}
return true;
}


编译成dll后,发布此插件,就可以在js中调用函数了: ON_OpenDevice(),ON_CloseDevice()

如:

function OpenDevice() {
        var plugin = document.getElementById("pluginid");
        var res = plugin.ON_OpenDevice();
        alert(res);
    }


备注:

NPAPI是Netscape Plugin Application Programming Interface的缩写,不难看出这项技术始创于Netscape(也就是Mozilla的前身),但是目前这项技术不仅限于Mozilla而成为了一个通用的标准。

事实上,除了IE使用微软自己的ActiveX技术以外,其他所有浏览器都采用NPAPI作为插件接口,也就是说只要符合NPAPI接口开发的插件,不但可以在Mozilla Firefox上使用,也可以在google Chrome、Apple Safari、Opera等浏览器上使用,我们常用的Flash播放器 、支付宝安全控件都是用NPAPI技术开发的。这些控件让我们可以使用不同的浏览器来播放flash动画和在线支付。

技术资料

提供几个介绍NPAPI技术的网址

  • https://developer.mozilla.org/en/Plugins
  • https://developer.mozilla.org/en/GeckoPluginAPI_Reference
  • https://developer.mozilla.org/En/WritingapluginforMacOSX

原创粉丝点击