在FireFox的插件中调用GetOpenFileName

时间:2012-11-07 21:09:32

标签: firefox npapi browser-plugin

我为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的项目中使用它们并不容易

1 个答案:

答案 0 :(得分:1)

您需要了解的主要事情是您必须永远阻止NPAPI插件中的主线程。你所谈论的函数都是阻塞调用,因此你绝不能在主线程上使用它们。

如果你在另一个主题上调用它们,你的问题就会消失;请注意,当你这样做时,你可能想要一个回调函数(javascript函数作为你可以调用InvokeDefault的NPObject进入),你只能在主线程上调用NPN_InvokeDefault,所以你必须设备一个在主线程上进行回调的方法。