文章来源:http://hi.baidu.com/hwygy_001/item/fda015d1803aaa12e0f46fac
npapi 函数返回值(返回BOOL,String,Int给调用Plugin的浏览器函数)
一直以来都习惯于js代码调用plugin函数返回调用成功失败的bool值,前两天项目需要函数调用返回一个字符串,本以为很简单的东西,就是一个返回值而已,不想却大动干戈,查找了很久都找不到原因,返回bool, int都可以,唯独string会出错,最后通过不断的google,终于找到了解决方法。先来看下NPAPI提供的转换方法:
BOOLEAN_TO_NPVARIANT
INT32_TO_NPVARIANT
DOUBLE_TO_NPVARIANT
STRINGZ_TO_NPVARIANT
OBJECT_TO_NPVARIANT
通常情况下直接调用转换方法,把要返回的值赋值给返回指针就好了。通常是invoke(NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result) 方法里面的result.
例如,
要返回一个布尔值以判断函数调用成功还是失败,BOOL bReturn = m_ctrlWnd.SetCtrlParam(para); BOOLEAN_TO_NPVARIANT(bReturn, *result); 就可以直接这么调用。函数调用成功,js端可以收到true,反之则是false;
要返回一个数字,可以用
INT32_TO_NPVARIANT
DOUBLE_TO_NPVARIANT
调用方法和booll的一样。
这里唯一有些区别的是String, 当需要返回字符串时,需要调用浏览器提供给插件的接口NPNetscapeFuncs,为字符串分配足够的内存空间,然后才能进行转换。
extern NPNetscapeFuncs * browser; //如果代码中没有定义过,需要在np_entry中先定义
const char * StringVariable = "1.0.0.1";//用这个值来充当函数返回值。如果是unicode,则需先转换成功ansi
char* outStr = (char*)browser->memalloc(strlen(StringVariable)+1);
if(!outStr) return false;
strcpy(outStr, StringVariable);
STRINGZ_TO_NPVARIANT(outStr, *result);
这样在page的js代码就可以接收到传递的string value.
至于,obj的返回方法还有待研究,欢迎拍砖。