我有一个我构建的 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。(我觉得很奇怪)。
这里有什么想法吗?我在吠叫正确的树吗?