我创建了一个简单的可编写脚本的npapi插件。它可以在FireFox上的JavaScript和插件之间传递字符串。但如果字符串包含连字符( - )符号,它将在Google Chrome上生成一些额外的随机字符。例如,在我的JavaScript代码中,我有
plugin.method("a-b");
在我的npapi代码上,我有
bool ScriptablePluginObject::Invoke(NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result) {
char* outString = args[0].value.stringValue.UTF8Characters;
char* npOutString = (char *)NPN_MemAlloc(strlen(outString) + 1);
strcpy(npOutString, outString);
STRINGZ_TO_NPVARIANT(npOutString, *result);
return true;
}
在Firefox上,它返回“a-b”,在Chrome上,我会看到“a-b * [ - ..”带有一些额外的随机符号。我尝试将npplugin.dll放在Mozilla下的“plugins”目录中或使用Chrome扩展教程(http://code.google.com/chrome/extensions/npapi.html),两种方式都给了我同样奇怪的行为。该代码使用xulrunner-10.0.2.en-US.win32.sdk编译,使用xulrunner-1.9.0.17.en-US.win32.sdk也有同样的问题。
有没有人有任何线索?
答案 0 :(得分:2)
您的问题是您假设它是标准的NULL终止C字符串。实际上,NPAPI字符串通常是C字符串并且NULL终止,但不能保证会出现这种情况。如果你查看npruntime.h header file from the npapi-sdk project,你会看到有一个NPString的UTF8Length成员;这不仅仅是装饰。您应该始终使用它来确定UTF8字符串的长度(以字节为单位)。
重申smorgan在下面的评论中所说的,这意味着你不能使用strcpy,strlen或任何其他C字符串函数来访问它; NPString是一个字节+长度对,因此您需要使用字节+长度方法访问它。
例如:
bool ScriptablePluginObject::Invoke(NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result) {
char* outString = args[0].value.stringValue.UTF8Characters;
int outLen = args[0].value.stringValue.UTF8Length;
char* npOutString = (char *)NPN_MemAlloc(outLen + 1);
memcpy(npOutString, outString, outLen);
// Make this NULL terminated
npOutString[outLen] = NULL;
STRINGZ_TO_NPVARIANT(npOutString, *result);
return true;
}
请注意,您还应该检查以确保NPVariant实际上是一个字符串,否则这一切都很容易在您脸上爆炸。