В настоящее время я пытаюсь разработать собственный менеджер паролей на C ++.
Я уже разработал развертываемый модуль, реализующий интерфейс nsILoginManagerStorage, могу установить его на firefox, и он правильно вызывается firefox при появлении поля пароля.
Проблема в том, что когда я пытаюсь создать экземпляр объекта nsILoginInfo, который должен быть возвращен, функция do_CreateInstance всегда возвращает ноль.
Моя реализация метода:
NS_IMETHODIMP FirefoxComponent::FindLogins(uint32_t *count, const nsAString & aHostname, const nsAString & aActionURL, const nsAString & aHttpRealm, nsILoginInfo * **logins)
{
nsILoginInfo ** array = static_cast<nsILoginInfo**>(nsMemory::Alloc(sizeof(nsILoginInfo*)));
nsresult result;
nsCOMPtr<nsILoginInfo> loginInfo = do_CreateInstance("@mozilla.org/login-manager/loginInfo;1" , &result);
//nsCOMPtr<nsILoginManager> loginInfo = do_CreateInstance("@mozilla.org/login-manager;1" , &result);if (NS_FAILED(result)){
printf("shouldn't be here!!\n");
return result;
}
}
Я попытался получить экземпляр nsILoginManager (просто чтобы проверить, работает ли он), но у него был тот же результат. NsILoginInfo может быть запущен с помощью java-скрипта на firefox с использованием:
Components.classes["@mozilla.org/loginmanager/loginInfo;1"].createInstance(Components.interfaces.nsILoginInfo);
Я использую Firefox 20.0 и xul-runner-sdk 20.0 (те же результаты с 20.0.1), на Ubuntu x64 и собираю с помощью QtCreator (для x64).
Мой код был вдохновлен https://github.com/infinity0/mozilla-gnome-keyring
Поскольку я теперь, когда nsILoginInfo правильно загружен в firefox, есть ли какое-либо обязательное поле / информация для firefox, чтобы позволить мне получить доступ к этим интерфейсам?
Спасибо за поддержку.
редактировать:
Попытка загрузить модуль путем прямого доступа к диспетчеру компонентов, но я не могу загрузить диспетчер компонентов.
nsIComponentManager * manager;
result = NS_GetComponentManager(&manager);if (NS_FAILED(result)){
printf("failed getting component manager!!\n");
return result;
}
После многих проб и ошибок я обнаружил, что эта ошибка была из-за плохого связывания библиотек. Мне не хватало одной библиотеки (libxpcom.so).
Для правильной компиляции и запуска я использую библиотеки libxpcom.so и libxpcomglue_s.a, которые находятся в папке lib gecko sdk / xul-runner.
Дополнительная информация о том, с какими библиотеками можно компилировать на каждой платформе
https://developer.mozilla.org/en-US/docs/XPCOM_Glue
Других решений пока нет …