Ich habe eine C++ App ich gebaut, die als Standard-Handler für eine Datei mit einer bestimmten Erweiterung registriert ist. Wenn ich also eine dieser Dateien mit Firefox von einer Website herunterlade, lädt sie sie in ein temporäres Verzeichnis herunter und dann führt Shell meine App aus, während der vollständige Pfad zur heruntergeladenen Datei in der Befehlszeile übergeben wird.Wie kann ich die Quell-URL einer Datei lesen, die mit FireFox von einer externen Anwendung heruntergeladen wurde?
Was ist der beste Weg, um aus der externen App herauszufinden, was die ursprüngliche Download-URL der Datei war, nur den Pfad auf der Festplatte gegeben? Kann ich XPCOM-API-Aufrufe verwenden, um die FireFox-Download-Manager-Datenbank zu überprüfen?
Ich habe herausgefunden, dass diese gespeicherte Daten erhalten im „% AppData% \ Mozilla \ Firefox \ ($ Profil) \ downloads.sqlite“-Datei, die eine SqlLite db-Datei ist, aber ich wirklich lieber nicht versuchen, um diese Datei direkt zu öffnen, da FireFox während der Ausführung einen offenen Schreibzugriff auf die Datei hat.
Nachdem ich das Mozilla Developer Center eine Weile durchgelesen habe, bin ich über den nsIDownloadManager Dienst gelaufen, der genau das Richtige zu sein scheint. Aber ich kann nicht scheinen, von XPCOM in einem separaten Prozess darauf zuzugreifen?
Hier ist der Code, den ich verwende:
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);
Als ich dies ausführen, die GetServiceByContractID() Aufruf zurückkehrt 0x8007000e, die in nsError.h als NS_ERROR_OUT_OF_MEMORY definiert ist. (was ich sehr seltsam finde).
Irgendwelche Ideen hier? Melde ich den richtigen Baum an?
Hmmm, das ist eine Schande. Die IE-Version von diesem war ziemlich direkt. Eine benutzerdefinierte FireFox-Erweiterung zu schreiben, nur damit ich nach der Ursprungssite fragen kann, erscheint mir als Overkill. Ich frage mich, ob ich eine Kopie der SQLite-Datei erstellen und öffnen kann nur lesen ... –
OK, ich habe aufgegeben, mit FireFox extern kommunizieren zu kommunizieren, jetzt schreibe ich eine Erweiterung für Download-Ereignisse zu hören. Meine Frage ist jetzt, was ist der beste Weg, um die ursprüngliche Download-URL zu meinem Programm zu bekommen? Ist es Shell möglich, ein externes Programm innerhalb einer Erweiterung auszuführen und die Ursprungs-URL auf der Kommandozeile zu übergeben? Oder gibt es einen besseren Weg? –