【问题标题】:NPAPI plug-in in safari can not call js function?safari中的NPAPI插件不能调用js函数?
【发布时间】:2013-01-15 04:01:21
【问题描述】:

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无法响应,是否有错误?

【问题讨论】:

    标签: plugins safari npapi


    【解决方案1】:

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

    这是问题 #1。

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

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

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

    【讨论】:

    • 谢谢出租车司机。我按你说的提醒了我的代码。但它只能在 safari 5 中正确运行。在 safari 6 中运行时,browser->invoke(mInstanceForJS, window, funcID, args , 1, &voidResponse); 永远不会结束。 info 是一个 XML 格式的字符串。
    • 请重新阅读我的回复并回答我提出的问题
    • 对不起,invoke函数一直在运行,就像死循环一样。 “Safari 无法响应”是什么意思?是否挂起?---Safari 已禁用,正在等待调用功能。 bRet 是否为假? ---invoke 函数正在运行,所以 bRet 无法获取值。 你的电脑是不是突然结冰了,所有的处理都停止了?---除Safari外,所有应用程序都可以正常运行。
    • 您在插件生命周期的哪个阶段调用此代码?启动时?响应对您的 NPObject 的调用?
    • 我找到了答案。在调用此代码之前,我的 NSWindow 正在运行应用程序模式对话框,并且此代码将在 js 函数中调用 alert()。但是警报NSWindow后面的对话框,我看不到并关闭它,所以safari被禁用了。
    猜你喜欢
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多