2013-04-30 62 views
0

我目前正在尝试在C++中开发自定义密码管理器。获取接口实现内置的Mozilla Firefox组件

我已经开发了实现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可以通过Java脚本的Firefox使用被instantited:

Components.classes["@mozilla.org/loginmanager/loginInfo;1"].createInstance(Components.interfaces.nsILoginInfo); 

我使用火狐20.0和XUL的亚军SDK 20.0(与20.0.1相同的结果),在Ubuntu 64位,并与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

经过大量的试验和错误,我发现这个错误是由于库的链接不好造成的。我错过了一个库(libxpcom.so)。

要编译并运行它,我使用libxpcom.so和libxpcomglue_s.a库,这两个库都在gecko sdk/xul-runner lib文件夹中找到。

有关在每个平台上编译哪些库的更多信息: https://developer.mozilla.org/en-US/docs/XPCOM_Glue