Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何读取FireFox从外部应用程序下载的文件的源URL? 我有一个C++应用程序,它被注册为具有特定扩展名的文件的默认处理程序。因此,当我使用Firefox从网站下载其中一个文件时,它会将其下载到一个临时目录,然后shell在命令行上传递下载文件的完整路径的同时执行我的应用程序_C++_Firefox_Xul_Xpcom - Fatal编程技术网

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

如何读取FireFox从外部应用程序下载的文件的源URL? 我有一个C++应用程序,它被注册为具有特定扩展名的文件的默认处理程序。因此,当我使用Firefox从网站下载其中一个文件时,它会将其下载到一个临时目录,然后shell在命令行上传递下载文件的完整路径的同时执行我的应用程序,c++,firefox,xul,xpcom,C++,Firefox,Xul,Xpcom,如果只考虑文件在磁盘上的路径,那么从外部应用程序了解文件原始下载url的最佳方法是什么?我可以使用XPCOM API调用检查FireFox下载管理器数据库吗 我发现这个数据get存储在“%APPData%\Mozilla\Firefox\($profile)\downloads.sqlite”文件中,这是一个SqlLite db文件,但我确实不想直接打开这个文件,因为Firefox在运行时有一个打开的文件写入句柄 在阅读了Mozilla开发者中心一段时间后,我运行了一个服务,这似乎正是我想要的。

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

我发现这个数据get存储在“%APPData%\Mozilla\Firefox\($profile)\downloads.sqlite”文件中,这是一个SqlLite db文件,但我确实不想直接打开这个文件,因为Firefox在运行时有一个打开的文件写入句柄

在阅读了Mozilla开发者中心一段时间后,我运行了一个服务,这似乎正是我想要的。但我似乎无法在单独的过程中从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);
nsresult rv;
//初始化XPCOM
nsCOMPtr servMgr;
rv=NS_InitXPCOM2(getter_AddRefs(servMgr),nsnull,nsnull);
确保成功(rv、rv);
//获取下载管理器实例
nsCOMPtr下载管理器;
rv=servMgr->GetServiceByContractID(NS\u DOWNLOADMANAGER\u CONTRACTID,
nsiloadmanager::GetIID(),getter_AddRefs(downloadMgr));
确保成功(rv、rv);
当我运行这个函数时,GetServiceByContractID()调用返回0x8007000e,它在nsError.h中定义为NS\u ERROR\u OUT\u内存。(我觉得很奇怪)


有什么想法吗?我是不是选对了树?

不,你不能从外部进程访问Firefox的XPCOM对象,你也不应该在Firefox打开sqlite数据库时打开它。我不知道有什么简单的方法可以不编写一个可以访问Firefox内部的Firefox扩展就做你想做的事情。

我现在对细节有点不清楚,但是,假设你下载的是一个定制的MIME类型,可以为该类型注册一个处理程序;然后,您的处理程序可以取消下载并将URL传递给您的应用程序。

Hmmm,真可惜。IE版本的这是相当直截了当的。编写一个定制的FireFox扩展,这样我就可以要求提供源站点,这对我来说似乎太过分了。我想知道我是否可以复制sqlite文件并以只读方式打开它……好吧,我已经放弃了尝试与FireFox进行外部通信,现在我正在编写一个扩展来侦听下载事件。我现在的问题是,将原始下载url转到我的程序的最佳方式是什么?是否可以在扩展中执行外部程序并在命令行上传入源url?还是有更好的办法?