【发布时间】:2009-05-14 16:43:31
【问题描述】:
我正在尝试在 Delphi 中构建一个 nsIProtocolHandler 实现。 (我之前成功地完成了一个 IInternetProtocol,并希望在 FireFox 中拥有我在 Internet Explorer 中所拥有的东西。) 感谢the d-gecko 项目,它以某种方式将 TInterfacedObject 魔法与 nsISupports 魔法联系起来,我能够制作一个 DLL,它在被问到时提供 nsIModule,在被问到时提供 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 在同一个线程中被调用 after 我的频道包装器死了。但谁在打电话?如果它是我试图包装的 http 通道,它如何生存(在同一个线程中)以及它如何控制调用侦听器?我很困惑。并且卡住了。
我曾尝试联系d-gecko项目的主要开发者,但没有得到回复。
(另外,有人注意到我在talk page on MDC on nsIProtocolHandler 底部的简介吗?)
(哦,还有一件事,是的,我知道如果我只从 C++ 中的 nsBaseChannel 继承“生活会更简单”。但重点是向现有的 Delphi 项目核心添加一个 FireFox 协议处理程序。)
更新:我做了更多的阅读,也提到了here:“流监听器的方法是 在调用 asyncOpen [...] 的线程上调用,但是我不清楚如果不先从“托管应用程序”调用,这怎么可能。这是 XPCOM 技巧吗?我想我必须阅读在我得到它之前(很多)更多的 Firefox 源。
【问题讨论】:
-
有人感兴趣吗,我昨天发布了一个为 FireFox 7.0 做好准备的版本:sourceforge.net/mailarchive/…
标签: delphi firefox delphi-7 gecko