safari中的NPAPI插件无法调用js函数?

时间:2013-01-15 04:01:21

标签: plugins safari npapi

all。我想调用一个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 = browser->调用(mInstanceForJS,window,funcID,args,1,& voidResponse); 时,Safari无法响应。是否有任何错误?

1 个答案:

答案 0 :(得分:0)

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

那是问题#1。

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

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

然后还有另一个问题:你的意思是“Safari无法回复”?忘记语法错误,我不确定你的意思。它挂了吗?是bRet假吗?您的计算机是否突然被冰封住,从而停止所有处理?如果上述内容无效,请回答这些问题,我会再试一次。