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