2013-01-15 39 views
0

all.I要调用一个js函数来显示东西在我的plugin.This是我的代码safari中的NPAPI插件无法调用js函数?

NPObject* npwindow = NULL; 
NPError ret = browser->getvalue(mInstanceForJS, NPNVWindowNPObject, &npwindow); 
if (ret != NPERR_NO_ERROR) 
    return ; 
// Get window object. 
NPVariant windowVar; 
NPIdentifier winID = browser->getstringidentifier("window"); 
bool bRet = browser->getproperty(mInstanceForJS, npwindow, winID, &windowVar); 
if (!bRet) 
{ 
    browser->releaseobject(npwindow); 
    return ; 
} 
NPObject* window = NPVARIANT_TO_OBJECT(windowVar); 
NPVariant voidResponse; 

NPVariant elementId; 
STRINGZ_TO_NPVARIANT([info UTF8String], elementId); 
NPVariant args[] = {elementId}; 

NPIdentifier funcID= browser->getstringidentifier([funName UTF8String]); 
bRet = browser->invoke(mInstanceForJS, window, funcID, args, 1, &voidResponse); 
browser->releasevariantvalue(&windowVar); 

时调用BRET =浏览器的>调用(mInstanceForJS,窗口,FUNCID,ARGS,1,& voidResponse);,Safari无法回应。是否有错误?

回答

0

npwindow已经是窗口对象;你正在有效地查询“window.window”。诚然,我不知道为什么这不起作用,但似乎有点奇怪。

这是问题#1。

问题2是您正在使用STRINGZ_TO_NPVARIANT来存储UTF8String的结果。 STRINGZ_TO_NPVARIANT不会复制内存,所以如果函数想挂在那个字符串上,你可能会遇到麻烦,因为当你的autorelease池循环时,它返回的字符串将被释放。当然,这也可能是内存泄漏。无论哪种方式,将字符串传递给浏览器的正确方法是使用NPN_MemAlloc为其分配内存,然后复制该字符串,然后将该指针传递给浏览器。有关更多信息,请参阅http://npapi.com/memory

问题3是你没有告诉我们什么时候运行这个代码;您很可能在插件或页面生命周期中尝试过早地运行此代码,因此可能无法正常工作。

然后还有另外一个问题:“Safari无法回应”是什么意思?忘记语法错误,我不确定这是什么意思。它挂了吗? bRet是否为假?你的电脑是否突然被冰封住,从而停止所有处理?如果以上内容没有帮助,请回答这些问题,我会再试一次。

+0

感谢taxilian.I提醒我的代码,因为你说。但它只能在safari 5中正确运行。当在Safari 6中运行时,** browser-> invoke(mInstanceForJS,window,funcID,args,1,&voidResponse); **永远不会完成。 ** info **是一个XML格式的字符串。 – Magical

+0

请重新阅读我的回复并提供问题的答案,我问 – taxilian

+0

对不起,调用函数一直在运行,就像一个死循环一样。 **您的意思是“Safari无法响应”,它是否挂起?** --- Safari被禁用并正在等待调用函数。 ** bRet是否为false?** --- invoke函数正在运行,因此bRet无法获得值。 **您的电脑是否突然被冰封住,从而停止所有处理?** ---除Safari之外,所有应用程序均可正常运行。 – Magical