Scriptable插件:在NPObject上调用错误的方法

时间:2012-06-27 16:54:44

标签: c++ google-chrome firefox npapi browser-plugin

我在Chrome和&amp ;;中的NPAPI插件中调用方法时收到JavaScript错误:Error calling method on NPObject Firefox上的XP。使用相同的浏览器在Windows 7上运行相同的代码是成功的。

我已经使用NPAPI构建了一个Scriptable插件,到目前为止我可以调试我的脚本化对象的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 个答案:

答案 0 :(得分:1)

在当前版本的浏览器中关于NPAPI的(讽刺)真棒(/讽刺)的事情是,如果任何出现错误,你会自动获得该错误消息,即使该插件还有试图用NPN_SetException设置异常。

我的第一个猜测是,您编译的代码的目标是Windows的更高版本而不是Windows XP;我不确定这是否会产生这个问题。我从来没有见过你正在描述的问题,而且我已经在xp,vista和7上运行了插件而没有任何问题。您也可以尝试使用FireBreath插件,看看是否出现问题。

我建议您使用调试器附加并设置一些断点。从NPN_GetValue开始,确保它实例化你的NPObject,然后在NPObject的HasMethod和Invoke方法中设置断点,看看有什么命中。可能在那里的东西会告诉你实际发生了什么,或者至少告诉你代码是什么或没有被击中。