0

我有一个我构建的 C++ 应用程序,它被注册为具有特定扩展名的文件的默认处理程序。因此,当我使用 Firefox 从网站下载其中一个文件时,它会将其下载到临时目录,然后 shell 执行我的应用程序,同时在命令行上将完整路径传递给下载的文件。

仅考虑磁盘上的路径,从外部应用程序中找出文件的原始下载 url 是什么的最佳方法是什么?我可以使用 XPCOM API 调用来检查 FireFox 下载管理器数据库吗?

我发现这些数据存储在“%APPData%\Mozilla\Firefox\($profile)\downloads.sqlite”文件中,这是一个 SqlLite 数据库文件,但我真的不想尝试直接打开这个文件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 回答