0

簡単なスクリプト可能なnpapiプラグインを作成しました。JavaScriptとFireFoxのプラグインの間で文字列を渡すことは問題なく機能します。ただし、文字列にハイフン(-)記号が含まれている場合、GoogleChromeで余分なランダム文字が生成されます。たとえば、私の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の下の「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を使用しても同じ問題が発生します。

誰か手がかりはありますか?

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 に答える