获取内置Mozilla Firefox组件的接口实现

时间:2013-04-30 03:15:09

标签: c++ firefox xpcom xulrunner gecko

我目前正在尝试用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;
    }

1 个答案:

答案 0 :(得分:0)

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

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

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