【问题标题】:How can I read the source URL of a file downloaded with FireFox from an external application?如何从外部应用程序读取使用 FireFox 下载的文件的源 URL?
【发布时间】:2009-07-30 17:44:30
【问题描述】:

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

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

我发现这些数据存储在 "%APPData%\Mozilla\Firefox\($profile)\downloads.sqlite" 文件中,该文件是一个 SqlLite db 文件,但我真的不要尝试直接打开这个文件,因为 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。 (我觉得很奇怪)。

这里有什么想法吗?我是在正确地吠叫吗?

【问题讨论】:

    标签: c++ firefox xul xpcom


    【解决方案1】:

    不,您不能从外部进程访问 Firefox 的 XPCOM 对象,并且您也不应该在 Firefox 打开时打开 sqlite 数据库。我不知道是否有任何直接的方法可以在不编写可以访问 Firefox 内部的 Firefox 扩展的情况下做你想做的事情。

    【讨论】:

    • 嗯,真可惜。这个的 IE 版本非常简单。编写一个自定义的 FireFox 扩展只是为了让我可以询问原始站点,这对我来说似乎有点矫枉过正。我想知道我是否可以复制 sqlite 文件并以只读方式打开它...
    • 好的,我已经放弃尝试与外部的 FireFox 通信,现在正在编写一个扩展来监听下载事件。我现在的问题是,将原始下载网址转移到我的程序的最佳方式是什么?是否可以从扩展中执行外部程序并在命令行上传递原始 url?还是有更好的办法?
    【解决方案2】:

    我现在对细节有点模糊,但是,假设您的下载是使用自定义 MIME 类型提供的,则可以为该类型注册一个处理程序;然后,您的处理程序可以取消下载并将 URL 传递给您的应用程序。

    【讨论】:

      猜你喜欢
      • 2020-09-02
      • 1970-01-01
      • 2017-12-01
      • 1970-01-01
      • 2021-11-24
      • 2023-03-22
      • 2015-04-09
      • 1970-01-01
      • 2016-12-12
      相关资源
      最近更新 更多