Google Chrome上的JavaScript和Scriptable NPAPI插件字符串数据

时间:2012-06-07 22:24:15

标签: google-chrome plugins npapi

我创建了一个简单的可编写脚本的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也有同样的问题。

有没有人有任何线索?

1 个答案:

答案 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实际上是一个字符串,否则这一切都很容易在您脸上爆炸。