0

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->invoke(mInstanceForJS, window, funcID, args, 1, &voidResponse); ,Safari 无法响应。是否有任何错误?

4

1 回答 1

0

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

这就是问题#1。

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

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

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

于 2013-01-15T04:47:07.390 回答