0

我创建了一个简单的可编写脚本的 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 上,它返回“ab”,在 Chrome 上,我会看到带有一些额外随机符号的“ab*[-..”。我尝试将 npplugin.dll 放在 Mozilla 下的“插件”目录中或使用 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也有同样的问题。

有没有人有任何线索?

4

1 回答 1

2

您的问题是您假设它是标准的以 NULL 结尾的 C 字符串。在实践中,NPAPI 字符串通常是 C 字符串并以 NULL 结尾,但不能保证会是这种情况。如果您查看npapi-sdk 项目中的 npruntime.h 头文件,您会看到 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 实际上是一个字符串,否则这很容易在您的脸上爆炸。

于 2012-06-08T03:16:35.917 回答