Плагин Scriptable: Ошибка вызова метода в NPObject
Я получаю ошибку JavaScript: Error calling method on NPObject
при вызове метода в моем плагине NPAPI в Chrome & Firefox на XP. Выполнение того же кода в Windows 7 с теми же браузерами прошло успешно.
Я создал плагин Scriptable с использованием NPAPI, поэтому я могу отлаживать в Invoke
метод моего объекта сценариев. Но я не верю, что у меня есть контроль после того, как он закончен.
У кого-нибудь есть какие-либо идеи? Это проблема только в Windows XP?
bool MY_ScriptableObject::Invoke(NPObject* npobj,
NPIdentifier name,
const NPVariant* args,
uint32_t argCount,
NPVariant* result)
{
bool rc = true;
char* wptr = NULL;
rc = false;
wptr = NULL;
if (name == NPN_GetStringIdentifier("getVersion"))
{
wptr = (NPUTF8*)NPN_MemAlloc(strlen("version:1.0.1") + 1); //Should be freed by browser
if (wptr != NULL)
{
rc = true;
memset(wptr,
0x00,
strlen("version:1.0.1")+1);
memcpy(wptr,
"version:1.0.1",
strlen("version:1.0.1"));
STRINGZ_TO_NPVARIANT(wptr,
*result);
}
}
return (rc);
}
Вот HTML-функция, которую я выполняю:
function Version()
{
var plugin = document.getElementById("plugin");
if (plugin == undefined)
{
alert("plugin failed");
return;
}
var text = plugin.getVersion(); //Error happens at this line
alert(text);
}
1 ответ
(Sarcasm) удивительная (/sarcasm) вещь о NPAPI в текущих версиях браузеров заключается в том, что если что-то пойдет не так с вызовом, вы автоматически получите это сообщение об ошибке, даже если плагин в противном случае попытался установить исключение с NPN_SetException.
Моим первым предположением будет то, что вы скомпилировали свой код для более поздней версии Windows, чем Windows XP; Я не уверен, что это приведет к этой проблеме или нет. Я никогда не видел проблему, которую вы описываете, и у меня без проблем работают плагины на xp, vista и 7. Вы также можете попробовать поиграть с плагином FireBreath и посмотреть, возникает ли проблема там или нет.
Я бы порекомендовал вам присоединиться с помощью отладчика и установить некоторые точки останова. Начните с NPN_GetValue и убедитесь, что он создает экземпляр вашего NPObject, затем установите точки останова в методах HasMethod и Invoke вашего NPObject и посмотрите, что получено. Скорее всего, что-то там покажет вам, что на самом деле происходит, или, по крайней мере, расскажет вам, что такое код или нет.