本人由于公司项目的需要,需一个火狐插件,由于以前有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