Delphi で nsIProtocolHandler 実装を構築しようとしています。(私は以前に IInternetProtocol を成功させたことがあり、Internet Explorer で得たものを FireFox で使用したいと考えています。) d-geckoプロジェクトのおかげで、何らかの方法で TInterfacedObject マジックを nsISupports マジックにリンクすることができます。要求されたときに nsIModule を提供し、要求されたときに nsIFactory を提供し、要求されたときに nsIProtocolHandler の 1 つを提供し、要求されたときに nsIChannel/nsIHttpChannel の 1 つを提供する DLL を作成します。
ホスト プロセスとして firefox.exe を使用してデバッグすると、ライブラリが読み込まれ、NewURI が 3 回呼び出され、NewChannel が呼び出され、nsIChannel とnsIHttpChannelを実装するオブジェクトが渡されることがわかります。
悩んでいるところです。AsyncOpen から制御を返すまで、取得した nsIStreamListener で OnStartRequest と OnDataAvailable を呼び出すことは想定されていませんが、AsyncOpen が呼び出されたスレッドで制御を取得していないようです。
CreateInstanceByContractID('@mozilla.org/network/protocol;1?name=http',
デフォルトのhttpハンドラー( ...で取得)の周りに自作のラッパーを使用してデバッグを試みました。渡されたリスナーもラップしました。奇妙なことに、チャネル ラッパーが終了した後、同じスレッドでOnStartRequest と OnDataAvailable が呼び出されます。しかし、誰が電話しているのですか?それがラップしようとしていた http チャネルである場合、どのように (同じスレッドで) 生き残り、リスナーを呼び出すための制御をどのように取得しますか? 私は困惑しています。そして立ち往生。
d-gecko プロジェクトの主な開発者に連絡を取ろうとしましたが、応答がありません。
(また、誰かがnsIProtocolHandler の MDC のトーク ページの下部にある私の宣伝文句に気付きましたか?)
(もう 1 つ、C++ で nsBaseChannel から継承するだけで「生活がよりシンプルになる」ことはわかっています。しかし、重要なのは、既存の Delphi プロジェクト コアに FireFox プロトコル ハンドラを追加することです。)
更新:私はさらにいくつかの読書を行いました.ここでも言及されています:「ストリームリスナーのメソッドは、asyncOpenを呼び出すスレッドで呼び出されます[...]」しかし、最初に「ホスティングアプリケーション」から呼び出されずにそれがどのように可能であるか、私には明らかではありません。それはXPCOMのトリックですか?Firefox のソースを入手する前に、もっと (もっと) 読む必要があると思います。