NPAPI插件开发记录(三)npapi 函数返回值(转)

文章来源: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的返回方法还有待研究,欢迎拍砖。

原文地址:https://www.cnblogs.com/xsgame/p/3088157.html