我为FireFox编写了插件,提供了选择文件的方法。此方法调用Win API函数GetOpenFileName
。当显示对话框“打开文件”并且我没有切换到其他窗口时,一切正常。如果我点击浏览器窗口然后全部被阻止,一段时间后我会看到插件已崩溃的消息。此问题仅适用于FireFox,并且在Chrome和Safari中不存在。我认为这与GetOpenFileName
拥有自己的消息循环这一事实有关。
有没有简单的方法来纠正这种行为?
e.g。函数SHBrowseForFolder
在FireFox中运行良好。
在FireFox源代码中,我看到类MessageLoop
和方法SetNestableTasksAllowed()
可能可以解决这个问题(至少这个结论可以通过标题中的解释来完成)。但是在xulrunner-sdk-13.0.1中,没有类MessageLoop
的头,尽管有xul.lib和函数GetIOMessageLoop
。可能从FireFox源中获取标题但我认为在VS 2010的项目中使用它们并不容易
答案 0 :(得分:1)
您需要了解的主要事情是您必须永远阻止NPAPI插件中的主线程。你所谈论的函数都是阻塞调用,因此你绝不能在主线程上使用它们。
如果你在另一个主题上调用它们,你的问题就会消失;请注意,当你这样做时,你可能想要一个回调函数(javascript函数作为你可以调用InvokeDefault的NPObject进入),你只能在主线程上调用NPN_InvokeDefault,所以你必须设备一个在主线程上进行回调的方法。