Строка NPVariant, возвращаемая из плагина NPAPI / NPRuntime, содержит дополнительный мусор - PullRequest
0 голосов
/ 08 марта 2011

Вот что я пытаюсь сделать из JavaScript:

var result;
result = document.myplugin.GetClientName();
document.write(result);

«GetClientName» должен возвращать NPVariant в браузер со строкой. Я получаю вывод с добавленным в конец мусором.

У кого-нибудь есть предложения по решению этой проблемы?

1 Ответ

2 голосов
/ 08 марта 2011

Умм ... правильно? Вы не предоставили пример кода и не объяснили, как вы распределяете свой NPVariant; это очень трудно помочь тебе, мой друг.

В основном вам просто нужно создать NPVariant, выделить для него достаточно памяти, используя NPN_MemAlloc , и назначить указатель на поле UTF8Characters NPString внутри объединения NPVariant и длины к длине UTF8.

Убедитесь, что вы распределили память и скопировали свою строку; если вы пытаетесь передать в память из std :: string или чего-то еще, что он, вероятно, освобождается перед его использованием, что может легко вызвать проблемы. Также не забудьте выделить дополнительный байт в конце строки для символа NULL - помните, что строки C заканчиваются NULL, и хотя спецификация NPAPI говорит, что вам просто нужно установить UTF8Length, я все еще видел случаи, когда Firefox в частности, ожидает строку с завершающей строкой NULL и ведет себя странно, если вы ее не дадите.

Если вы хотите пойти по этому пути, вам может пригодиться этот пост в блоге:

Однако могу ли я предложить более простой маршрут? Написание плагина NPAPI - непростая задача, и для того, чтобы сделать это хорошо и безопасно, требуется большой опыт и исследования. Если вы используете FireBreath , вы можете писать плагины NPAPI на платформе C ++, которая уже делает все это для вас и позволяет использовать обычные типы данных C ++ STL, работает на нескольких платформах и, как правило, экономит массу времени и средств. хлопот.

Для получения небольшой информации о подходе, используемом FireBreath со сценариями, см. мой пост на тему .

...