Plugins safari中的NPAPI插件不能调用js函数?

Plugins safari中的NPAPI插件不能调用js函数?,plugins,safari,npapi,Plugins,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 win

好的。我想调用一个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无法响应。是否有任何错误?

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

这就是问题所在

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

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


然后还有另一个问题:你说的“狩猎不能回应”是什么意思?忘了语法错误,我不知道你这是什么意思。它挂起来了吗?布雷特是假的吗?您的计算机是否突然被冰包裹,从而停止所有处理?如果以上内容没有帮助,请回答这些问题,我会再试一次。

谢谢taxilian。我按照您的说法提醒了我的代码。但它只能在safari 5中正确运行。在safari 6中运行时,浏览器->调用(mInstanceForJS、window、funcID、args、1和voidResponse);永不结束。info是XML格式的字符串。请重新阅读我的回答并回答我提出的问题。对不起,调用函数一直在运行,就像一个死循环。“Safari无法响应”是什么意思?它挂起了吗?---Safari已禁用,正在等待调用函数。布雷特是假的吗---invoke函数正在运行,因此bRet无法获取值。您的计算机是否突然被冰包裹,从而停止所有处理?---除了Safari,所有应用程序都可以正常运行。您在插件生命周期的什么时候调用此代码?启动时?在响应对NPObject的调用时?我找到了答案。在调用此代码之前,我的NSWindow正在运行应用程序模式对话框,此代码将调用js函数中的alert()。但是NSWindow后面的alert对话框,我无法看到并关闭它,因此safari被禁用。