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无法响应。是否有任何错误?
答案 0 :(得分:0)
npwindow已经是窗口对象;你有效地查询“window.window”。当然,我不知道为什么这不起作用,但似乎有点奇怪。
那是问题#1。
问题#2是您使用STRINGZ_TO_NPVARIANT来存储UTF8String的结果。 STRINGZ_TO_NPVARIANT不会复制内存,因此如果函数要挂起到该字符串,您可能会遇到麻烦,因为当您的自动释放池循环时,它返回的字符串将被释放。当然,这也可能是内存泄漏。无论哪种方式,将字符串传递给浏览器的正确方法是使用NPN_MemAlloc为其分配内存,然后将字符串复制到。然后将该指针传递给浏览器。有关详细信息,请参阅http://npapi.com/memory。
问题#3是你没有告诉我们你何时运行这段代码;您很可能在插件或页面生命周期中过早地运行此代码,因此可能无法正常运行。
然后还有另一个问题:你的意思是“Safari无法回复”?忘记语法错误,我不确定你的意思。它挂了吗?是bRet假吗?您的计算机是否突然被冰封住,从而停止所有处理?如果上述内容无效,请回答这些问题,我会再试一次。