特定の拡張子を持つファイルのデフォルト ハンドラーとして登録されている、作成した 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 として定義されています。(私は非常に奇妙だと思います)。
ここに何かアイデアはありますか?私は正しい木に向かって吠えていますか?