没接触火狐插件开发之前,不由自主就觉得这是个令人兴奋和头痛的开发,事实过程还算不是很坎坷,只是有几个问题头痛了小一会儿,现我将这次的开发过程结合网上的资料,整理出一个比较完整、实用的火狐插件开发文档。
一.火狐插件:
1.前期准备工作:
(1)下载Gecko SDK.。链接地址为:https://developer.mozilla.org/en/gecko_sdk,注意你火狐的版本不能低于Gecko SDK的版本。
(2)下载火狐插件开发官方例子。链接地址为:
https://developer.mozilla.org/en/Plugins/Samples_and_Test_Cases,该例子包含在unix、mac、
windows等几种平台开发的例子,总共有4个windows平台不同的例子,打开以下工程:
AllWin32Samples.dsw就是windows平台所有的例子。
2.自己新建一个工程,编译一个火狐插件,参考链接如下:
https://developer.mozilla.org/En/Compiling_The_npruntime_Sample_Plugin_in_Visual_Studio
http://wenku.baidu.com/view/8b5f0bd276a20029bd642ddb.html
4.我将火狐插件的开发过程中可能出现而网上较少提及的问题整理如下:
(1)获取网页的属性参数:
ie是通过每增加一个属性就增加一个接口的方法来获取网页的属性参数,而NPAPI接口不是采用这样的方法,
(2)获取火狐url,有的网页可能嵌套了一层网页,看你具体想获得那一层网页的url:
1)获得自己所在层的url代码如下:
NPObject*locObj = NULL;
NPVariantrval;
NPIdentifiern = NPN_GetStringIdentifier("location");
NPN_GetProperty(m_pNPInstance,sWindowObj, n, &rval);
if(NPVARIANT_IS_OBJECT(rval) && (locObj = NPVARIANT_TO_OBJECT(rval)))
{
n =NPN_GetStringIdentifier("href");
NPN_GetProperty(m_pNPInstance, locObj, n,&rval);
if (NPVARIANT_IS_STRING(rval))
{
NPN_ReleaseVariantValue(&rval);//rval里面就有url地址
}
}
2)获得最上层url代码如下:
NPObject*locObj = NULL;
NPVariantrval;
NPIdentifiern;
n =NPN_GetStringIdentifier("parent");
NPN_GetProperty(m_pNPInstance,sWindowObj, n, &rval);
while(NPVARIANT_IS_OBJECT(rval)&& (tempObj = NPVARIANT_TO_OBJECT(rval)))
{
if (locObj == tempObj)
{
break;
}
locObj = tempObj;
n = NPN_GetStringIdentifier("parent");
NPN_GetProperty(m_pNPInstance, tempObj,n, &rval);
}
if (NULL != locObj)
{
n =NPN_GetStringIdentifier("location");
NPN_GetProperty(m_pNPInstance,locObj, n, &rval);
locObj =NPVARIANT_TO_OBJECT(rval);
n =NPN_GetStringIdentifier("href");
NPN_GetProperty(m_pNPInstance,locObj, n, &rval);
if (NPVARIANT_IS_STRING(rval))
{
NPN_ReleaseVariantValue(&rval);//rval里面就有url地址
}
}
二.谷歌插件:
谷歌插件跟火狐插件是一模一样的,注册在HKEY_CURRENT_USER\Software\
MozillaPlugins上的火狐插件,谷歌就能识别。但是我们的快玩插件在谷歌上运行的时候会崩溃,通过层层屏蔽代码终于找到导致崩溃的原因是在plugin.cpp文件中的以下这两个函数:
(1) NPN_Evaluate(m_pNPInstance,doc, &str, NULL);
(2) NPN_InvokeDefault(m_pNPInstance,NPVARIANT_TO_OBJECT(barval), &arg, 1,&rval);
我暂时的解决方法是屏蔽这两个函数,因为看了这两个函数的前后发现屏蔽了不会有什么影响,通过测试确实发现没什么影响。