0

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

我已经使用 NPAPI 构建了一个 Scriptable 插件,到目前为止,我可以调试到Invoke我的 Scriptable 对象的方法。但我不相信它完成后我有任何控制权。
有没有人有任何想法?这是否仅在 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);
}
4

1 回答 1

1

在当前版本的浏览器中,关于 NPAPI 的(讽刺)真棒(/讽刺)的事情是,如果调用出现任何问题,您会自动收到该错误消息,即使插件尝试使用 NPN_SetException 设置异常也是如此。

我的第一个猜测是您编译的代码针对的是比 windows XP 更高版本的 windows;我不确定这是否会产生这个问题。我从未见过您描述的问题,并且我在 xp、vista 和 7 上运行的插件没有任何问题。您也可以尝试使用FireBreath插件,看看是否存在问题。

我建议您附加一个调试器并设置一些断点。从 NPN_GetValue 开始并确保它正在实例化您的 NPObject,然后在您的 NPObject 的 HasMethod 和 Invoke 方法中设置断点并查看命中了什么。可能其中的某些内容会向您展示实际发生的情况,或者至少告诉您哪些代码受到或没有受到打击。

于 2012-06-28T05:24:38.940 回答