我目前正在尝试用c ++开发自定义密码管理器。
我已经开发了一个实现nsILoginManagerStorage接口的可部署模块,可以在firefox上安装它,当出现密码字段时,firefox会正确调用它。
问题在于,当我尝试实例化要返回的nsILoginInfo对象时,do_CreateInstance函数始终返回null。 我的方法实现是:
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可以通过firefox上的java脚本使用:
来实现 Components.classes["@mozilla.org/loginmanager/loginInfo;1"].createInstance(Components.interfaces.nsILoginInfo);
我在Ubuntu x64上使用firefox 20.0和xul-runner-sdk 20.0(与20.0.1相同的结果),并使用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;
}
答案 0 :(得分:0)
经过大量试验和错误后,我发现此错误是由于库的链接错误造成的。我错过了一个库(libxpcom.so)。
要编译并运行它,我使用库libxpcom.so和libxpcomglue_s.a,两者都在gecko sdk / xul-runner lib文件夹中找到。
有关在每个平台中编译哪些库的更多信息: https://developer.mozilla.org/en-US/docs/XPCOM_Glue