0

我为 FireFox 编写了插件,它提供了选择文件的方法。此方法调用 Win API 函数GetOpenFileName。当显示“打开文件”对话框并且我没有切换到其他窗口时,一切正常。如果我点击浏览器窗口,那么一切都会被阻止,一段时间后我会看到插件崩溃的消息。此问题仅在 FireFox 中存在,在 Chrome 和 Safari 中不存在。GetOpenFileName我认为这与有自己的消息循环的事实有关。有没有简单的方法来纠正这种行为?

例如函数SHBrowseForFolder在 FireFox 中运行良好。

在 FireFox 源代码中,我看到了可能可以解决这个问题的类MessageLoop和方法SetNestableTasksAllowed()(至少这个结论可以从标题中的解释中得出)。但是在 xulrunner-sdk-13.0.1 中没有带有类的头文件,MessageLoop尽管有带有 function 的 xul.lib GetIOMessageLoop。可能可以从 FireFox 源中获取标头,但我认为在我的 VS 2010 项目中使用它们并不容易

4

1 回答 1

1

您需要在这里了解的主要内容是,您绝不能阻塞 NPAPI 插件中的主线程。你所说的函​​数都是阻塞调用,所以你绝对不能在主线程上使用它们。

如果您在不同的线程上调用它们,您的问题应该会消失;请注意,当您执行此操作时,您可能需要一个回调函数(javascript 函数以 NPObject 形式出现,您可以在其上调用 InvokeDefault),并且您只能在主线程上调用 NPN_InvokeDefault,因此您必须设置一个在主线程上进行回调的方法。

于 2012-11-08T03:43:38.830 回答