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

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

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

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

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

1 ответ

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

По сути, вам просто нужно создать NPVariant, выделить для него достаточно памяти с помощью NPN_MemAlloc и назначить указатель на поле UTF8Characters строки NPSt в объединении NPVariant, а длину - на UTF8Length.

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

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

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

Немного информации о подходе, используемом FireBreath при написании скриптов, смотрите в моем блоге на эту тему.

Другие вопросы по тегам