0

特定の拡張子を持つファイルのデフォルト ハンドラーとして登録されている、作成した C++ アプリがあります。したがって、Web サイトから Firefox でこれらのファイルの 1 つをダウンロードすると、一時ディレクトリにダウンロードされ、コマンド ラインでダウンロードしたファイルへのフル パスを渡しながらシェルがアプリを実行します。

ディスク上のパスのみが与えられた場合、ファイルの元のダウンロード URL が何であったかを外部アプリから把握する最良の方法は何ですか? XPCOM API 呼び出しを使用して、FireFox ダウンロード マネージャー データベースを検査できますか?

このデータは、SqlLite db ファイルである「%APPData%\Mozilla\Firefox\($profile)\downloads.sqlite」ファイルに格納されていることがわかりましたが、このファイルを次のように直接開こうとはしません。 FireFox は、実行中にファイルへの書き込みハンドルを開いています。

しばらく Mozilla 開発者センターを熟読した後、nsIDownloadManagerサービスに出くわしました。しかし、別のプロセスで XPCOM からアクセスできないようです。

私が使用しているコードは次のとおりです。

nsresult rv;

//init XPCOM
nsCOMPtr<nsIServiceManager> servMgr; 
rv = NS_InitXPCOM2(getter_AddRefs(servMgr), nsnull, nsnull);
NS_ENSURE_SUCCESS(rv, rv);

//Get a download manager instance
nsCOMPtr<nsIDownloadManager> downloadMgr;
rv = servMgr->GetServiceByContractID(NS_DOWNLOADMANAGER_CONTRACTID,
       nsIDownloadManager::GetIID(),  getter_AddRefs(downloadMgr));
NS_ENSURE_SUCCESS(rv, rv);

これを実行すると、GetServiceByContractID() 呼び出しは 0x8007000e を返します。これは nsError.h で NS_ERROR_OUT_OF_MEMORY として定義されています。(私は非常に奇妙だと思います)。

ここに何かアイデアはありますか?私は正しい木に向かって吠えていますか?

4

2 に答える 2

1

いいえ、外部プロセスから Firefox の XPCOM オブジェクトにアクセスすることはできません。また、Firefox が開いている間は sqlite データベースを開くべきではありません。Firefox 内部にアクセスできる Firefox 拡張機能を作成せずに、やりたいことを行う簡単な方法があるかどうかはわかりません。

于 2009-07-30T18:24:36.847 に答える
0

詳細についてはまだ少しわかりませんが、ダウンロードがカスタム MIME タイプで提供されると仮定すると、そのタイプのハンドラーを登録することができます。その後、ハンドラーはダウンロードをキャンセルして、URL をアプリケーションに渡すことができます。

于 2011-01-29T00:33:22.170 に答える