Плагин 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 и посмотрите, что получено. Скорее всего, что-то там покажет вам, что на самом деле происходит, или, по крайней мере, расскажет вам, что такое код или нет.

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