我有一个我构建的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。 (我觉得很奇怪)。
这里有什么想法吗?我咆哮着正确的树吗?
答案 0 :(得分:1)
不,您无法从外部进程访问Firefox的XPCOM对象,而且在Firefox打开时也不应该打开sqlite数据库。我不知道在没有编写可以访问Firefox内部的Firefox扩展的情况下,有任何直接的方法可以做你想做的事。
答案 1 :(得分:0)
我现在对细节有些朦胧,但是,假设您的下载是使用自定义MIME类型提供的,则可以为该类型注册处理程序;然后,您的处理程序可以取消下载并将URL传递给您的应用程序。