最近在用NPAPI开发基于vlc的Firefox插件,基于开源项目npvlc进行定制修改,在这过程中遇到一些问题记录一下。
问题:从NPVariant 类型参数 提取出stringValue,然后从stringValue提取出 const char*部分数据
方法如下:
首先看 NPVariant定义:
typedef struct _NPVariant {
NPVariantType type;
union {
bool boolValue;
int32_t intValue;
double doubleValue;
NPString stringValue;
NPObject *objectValue;
} value;
} NPVariant;
NPVariant提供NPVARIANT_TO_STRING(args[0]), NPVARIANT_TO_OBJECT(args[0]), NPVARIANT_TO_BOOLEAN(args[0]) 等操作【args为:NPVariant *args】,这些操作定义如下:
#define NPVARIANT_IS_VOID(_v) ((_v).type == NPVariantType_Void)
#define NPVARIANT_IS_NULL(_v) ((_v).type == NPVariantType_Null)
#define NPVARIANT_IS_BOOLEAN(_v) ((_v).type == NPVariantType_Bool)
#define NPVARIANT_IS_INT32(_v) ((_v).type == NPVariantType_Int32)
#define NPVARIANT_IS_DOUBLE(_v) ((_v).type == NPVariantType_Double)
#define NPVARIANT_IS_STRING(_v) ((_v).type == NPVariantType_String)
#define NPVARIANT_IS_OBJECT(_v) ((_v).type == NPVariantType_Object)
#define NPVARIANT_TO_BOOLEAN(_v) ((_v).value.boolValue)
#define NPVARIANT_TO_INT32(_v) ((_v).value.intValue)
#define NPVARIANT_TO_DOUBLE(_v) ((_v).value.doubleValue)
#define NPVARIANT_TO_STRING(_v) ((_v).value.stringValue)
#define NPVARIANT_TO_OBJECT(_v) ((_v).value.objectValue)
而NPString定义如下:
typedef struct _NPString {
const NPUTF8 *UTF8Characters;
uint32_t UTF8Length;
} NPString;
所以,很简单:从NPVariant 类型参数 提取出 const char*部分数据的方法是:
const char* outString = (NPVARIANT_TO_STRING(args[0])).UTF8Characters;
等价于:
const char* outString = args[0].value.stringValue.UTF8Characters;
同理
int outLength = (NPVARIANT_TO_STRING(args[0])).UTF8Length;
等价于:
int outLength= args[0].value.stringValue.UTF8Length;