【问题标题】:Scriptable plugin: Error calling method on NPObject可编写脚本的插件:在 NPObject 上调用方法时出错
【发布时间】:2012-06-27 16:54:44
【问题描述】:

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

我已经使用 NPAPI 构建了一个 Scriptable 插件,到目前为止,我可以调试到我的 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);
}

【问题讨论】:

  • 把你的代码格式化成相当不稳定的状态,好吗?
  • 我不确定我的代码格式有什么问题?
  • 仅供参考 hapyfishrmn,您不应该回滚有用的编辑。 @EitanT 向您展示了您的代码格式有什么问题并修复了它,以便其他人可以更轻松地阅读和理解您的代码。我不知道你为什么要这么做。
  • @jmort253 每个人在格式化方面都有自己的偏好,如果这里有一个要关注的,我会很乐意这样做(我看了但没有找到),但似乎他要去竭尽全力做出符合他理解的改变,但对事业没有任何帮助。我很乐意有人更改我的问题以提供帮助并使其对未来的人更加理解。
  • 如果对@hapyfishrmn 有帮助,我认为他让阅读更容易。请记住,您自己的代码总是会更容易阅读,无论其格式如何。作为我们代码的单一作者,我们有一点偏见,不会扩展到我们代码的 N 个可能的读者。此外,Eitan 所做的更“符合标准”,这意味着更多的人可能能够比在这里拥有一些非预期的东西更快地同化。希望这可以帮助! :)

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


【解决方案1】:

在当前版本的浏览器中,关于 NPAPI 的 (sarcasm)awesome(/sarcasm) 事情是,如果 anything 调用出错,您会自动收到该错误消息,即使插件有其他错误尝试使用 NPN_SetException 设置异常。

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

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

【讨论】:

  • 添加预处理器定义:/D "WIN32" 成功了。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多