我正在尝试在 Delphi 中构建一个 nsIProtocolHandler 实现。(我之前成功地完成了一个 IInternetProtocol,并希望在 FireFox 中拥有我在 Internet Explorer 中所拥有的东西。)感谢d-gecko项目,它以某种方式将 TInterfacedObject 魔法与 nsISupports 魔法联系起来,我能够制作一个在被询问时提供 nsIModule 的 DLL,在被询问时提供 nsIFactory,在被询问时提供我的 nsIProtocolHandler 之一,在被询问时提供我的 nsIChannel/nsIHttpChannel 之一。
当使用 firefox.exe 作为主机进程进行调试时,我可以看到我的库被加载,NewURI 被调用了 3 次,NewChannel 被调用,并且我传递了一个实现 nsIChannel 和nsIHttpChannel的对象。
这就是我困扰的地方。在我从 AsyncOpen 返回控制权之前,我不应该在我得到的 nsIStreamListener 上调用 OnStartRequest 和 OnDataAvailable,但我似乎没有在调用 AsyncOpen 的线程中重新获得控制权。
我尝试使用围绕默认http处理程序的自制包装器进行调试(使用CreateInstanceByContractID('@mozilla.org/network/protocol;1?name=http',
...)。我也把监听器包裹过去了。奇怪的是,我看到 OnStartRequest 和 OnDataAvailable 在我的通道包装器死后在同一个线程中被调用。但谁在打电话?如果它是我试图包装的 http 通道,它如何生存(在同一个线程中)以及它如何控制调用侦听器?我很困惑。并且卡住了。
我曾尝试联系 d-gecko 项目的主要开发人员,但没有得到回应。
(另外,有人注意到我在 nsIProtocolHandler 上 MDC 讨论页底部的简介吗?)
(哦,还有一件事,是的,我知道“生活会更简单”,如果我只是从 C++ 中的 nsBaseChannel 继承。但重点是在现有的 Delphi 项目核心中添加一个 FireFox 协议处理程序。)
更新:我已经阅读了更多内容,这里也提到了:“流侦听器的方法在调用 asyncOpen [...] 的线程上被调用”,但是如果不先从“托管应用程序”调用,这怎么可能? ,我不清楚。这是XPCOM的把戏吗?我想在我得到它之前我必须阅读(很多)更多的 Firefox 源代码。