在FireFox的插件中调用GetOpenFileName

在FireFox的插件中调用GetOpenFileName,firefox,npapi,browser-plugin,Firefox,Npapi,Browser Plugin,我为FireFox编写了插件,它提供了选择文件的方法。此方法调用Win API函数GetOpenFileName。当对话框“打开文件”显示,我没有切换到其他窗口,然后所有工作正常。若我点击浏览器窗口,那个么一切都会被阻止,过了一段时间,我会看到一条消息,插件崩溃了。这个问题只存在于FireFox中,Chrome和Safari中没有。我认为这与GetOpenFileName有自己的消息循环这一事实有关。 有没有简单的方法来纠正这种行为 e、 g.函数SHBrowseForFolder在FireFo

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

e、 g.函数
SHBrowseForFolder
在FireFox中运行良好


在FireFox源代码中,我看到类
MessageLoop
和方法
SetNestableTasksAllowed()
,它们可能可以解决这个问题(至少可以从标题中的解释中得出这个结论)。但是在xulrunner-sdk-13.0.1中,没有带有class
MessageLoop
的头,尽管有带有函数
GetIOMessageLoop
的xul.lib。可能可以从FireFox源代码中获取头文件,但我认为在VS 2010的项目中使用它们并不容易。这里需要了解的主要问题是,在NPAPI插件中决不能阻止主线程。你所说的函数都是阻塞调用,所以你不能在主线程上使用它们

如果你在不同的线程上给他们打电话,你的问题就会消失;请注意,在执行此操作时,您可能需要一个回调函数(javascript函数作为NPObject引入,您可以在其上调用InvokedFault),并且您只能在主线程上调用NPN_InvokedFault,因此您必须在主线程上设置一种回调方法