2013-04-30 10 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