У меня есть приложение на C ++, которое я создал и зарегистрировано как обработчик по умолчанию для файла с определенным расширением. Поэтому, когда я загружаю один из этих файлов с помощью Firefox с веб-сайта, он загружает его во временный каталог, а затем оболочка выполняет мое приложение, передавая полный путь к загруженному файлу в командной строке.
Как лучше всего определить из внешнего приложения исходный URL-адрес файла для загрузки, учитывая только его путь на диске? Могу ли я использовать вызовы API XPCOM для проверки базы данных менеджера загрузок 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. (что я нахожу очень странным).
Есть идеи здесь? Я лаю на правильное дерево?