我在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);
}
答案 0 :(得分:1)
在当前版本的浏览器中关于NPAPI的(讽刺)真棒(/讽刺)的事情是,如果任何出现错误,你会自动获得该错误消息,即使该插件还有试图用NPN_SetException设置异常。
我的第一个猜测是,您编译的代码的目标是Windows的更高版本而不是Windows XP;我不确定这是否会产生这个问题。我从来没有见过你正在描述的问题,而且我已经在xp,vista和7上运行了插件而没有任何问题。您也可以尝试使用FireBreath插件,看看是否出现问题。
我建议您使用调试器附加并设置一些断点。从NPN_GetValue开始,确保它实例化你的NPObject,然后在NPObject的HasMethod和Invoke方法中设置断点,看看有什么命中。可能在那里的东西会告诉你实际发生了什么,或者至少告诉你代码是什么或没有被击中。