現在、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;
}