现在的位置: 首页 > 综合 > 正文

Firefox插件中invoke方法获取参数以及参数转化

2014年10月22日 ⁄ 综合 ⁄ 共 3351字 ⁄ 字号 评论关闭

boolScriptablePluginObject::Invoke(NPObject* obj, NPIdentifier methodName,

                    const NPVariant* args, uint32_targCount,

                    NPVariant* result)方法中的部分核心代码:

ScriptablePluginObject *thisObj =(ScriptablePluginObject*)obj;

char*name = npnfuncs->utf8fromidentifier(methodName);//name就是JavaScript调用的方法名

boolret_val = false ;

VOID_TO_NPVARIANT(*result);//result就是用于保存传递给JavaScript的值

//定义一个方法

const char*  kRunQQ = "runQQ";

//判断方法:

if(!strcmp(name, kRunQQ)) {

   … …

}

 

#define MY_BUFSIZE 132

//外面传进来的参数:用户名和密码

if (args != NULL) {             

NPVariantnpvName = args[0];

       NPVariantnpvPass = args[1];

       if( NPVARIANT_IS_STRING(npvName) && NPVARIANT_IS_STRING(npvPass) ) {

              NPStringnpsName = NPVARIANT_TO_STRING(npvName);

              NPStringnpsPass = NPVARIANT_TO_STRING(npvPass);

              //字符串拼接;       

char ansi[MY_BUFSIZE]={0};  

              memset(ansi,0,MY_BUFSIZE);

              strcat_s(ansi, "username: ");

              strcat_s(ansi, npsName.UTF8Characters);                 

              intnLenName = npsName.UTF8Length ;

              if(nLenName!=strlen(npsName.UTF8Characters) )

              {

                     ansi[strlen(ansi)-1]='\0';

              }

strcat_s(ansi , " password: ");       

              strcat_s(ansi, npsPass.UTF8Characters);

              intnLenPass = npsPass.UTF8Length ;

              if(nLenPass!=strlen(npsPass.UTF8Characters) )

              {

                     ansi[strlen(ansi)-1]='\0';

              }

              //将结果(字符串类型)从插件中输出,供JavaScript接收:                            

              const char* outString = ansi ;

               char* npOutString = (char*)npnfuncs->memalloc(strlen(outString) + 1);

               strcpy(npOutString, outString);

               STRINGZ_TO_NPVARIANT(npOutString,*result);

                   //将结果(整型)从插件中输出,供JavaScript接收:

                   int nameLen = strlen(npsName.UTF8Characters) ;

                   int nameUTF8Len = npsName.UTF8Length ;

                   INT32_TO_NPVARIANT(nameLen+nameUTF8Len, *result);

 

}

}

重点说明:

在制作火狐firefox插件的时候,将NPString类型转换成C语言能够识别的类型采用的是.utf8characters,而在制作谷歌Chrome插件的时候,将NPString类型转换成C语言能够识别的类型采用的是.UTF8Characters;.utf8characters在转换值的类型的时候不会有问题,但是.UTF8Characters在转换值的类型的时候有很大的问题:当传入的值的长度为奇数的时候,被.UTF8Characters转换后的结果的最后一位会出现乱码,当传入的值的长度为偶数的时候,被.UTF8Characters转换后的结果没有问题。当传入的值的长度越长,被.UTF8Characters转换后的结果出错的概率越大。

所以,需要进行特殊处理(特殊处理的关键就是根据.UTF8Length的正确性去对.UTF8Characters处理后的值进行处理):

const char* passString = npsPass.UTF8Characters;

int passLen= npsPass.UTF8Length;

char*npOutString = (char *)npnfuncs->memalloc(passLen+ 1);

//有些地方是char* npOutString = (char *)NPN_MemAlloc(passLen + 1);

memcpy(npOutString, passString, passLen);

// Make this NULL terminated

npOutString[passLen] = NULL;

 

测试页面:

<html>

<head>

<script>

window.onload = function(){

              //加载插件成为一个mimetype对象

              varmimetype = navigator.mimeTypes["application/huawei-rzd-plugin"];

           if(mimetype)

           {

              var plugin =mimetype.enabledPlugin; 

              if(plugin)

              {

                     hwrzd =document.getElementById('hwrzd');

              }

           }

           else

           {     //如果没有安装插件,给出信息:提示用户安装浏览器插件

                  alert("no plug-in . ");

                     return;

           }

           try{

                     alert(hwrzd.runRCS("afei","123456!@#$%^&*()_"));

           }catch(e){

           }

       }

</script>

</head>

<embed id="hwrzd"type="application/huawei-rzd-plugin">

<body></body>

</html>

转载至http://blog.csdn.net/feelwing1314/article/details/9961587

抱歉!评论已关闭.