Строка 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 при написании скриптов, смотрите в моем блоге на эту тему.