1

私は何百万もの異なることを試しましたが、これを機能させることはできません。

私が持っているxpiファイルの中に:

* content folder
     -browserOverlay.js
     -browserOverlay.xul

* locale folder
     *en-US folder
         -browserOverlay.dtd
         -browserOverlay.properties
* skin folder
         -browserOverlay.css

Firefox 14.0.1 を使用していますが、「Hello World」拡張機能の XPCOM を使用しない部分が機能しています。今のところ、クリックすると「Hello World」が表示されるボタンを含むツールバーを追加し、Gecko SDK を使用して構築し、VS 2005 を使用してコンパイルした C++ XPCOM コンポーネントを実行しようとするだけです。

browserOverlay.js ファイルには、次のコードが含まれています。

/**
 * XULSchoolChrome namespace.
 */
if ("undefined" == typeof(XULSchoolChrome)) {
  var XULSchoolChrome = {};
};

/**
 * Controls the browser overlay for the Hello World extension.
 */
XULSchoolChrome.BrowserOverlay = {
  /**
   * Says 'Hello' to the user.
   */
  sayHello : function(aEvent) {
    let stringBundle = document.getElementById("xulschoolhello-string-bundle");
    let message = stringBundle.getString("xulschoolhello.greeting.label");

    window.alert(message);


    try
    {
      // normally Firefox extensions implicitly have XPCOM privileges
      //but since this is a file we have to request it.

      netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
      const cid = "@example.com/XPCOMSample/MyComponent;1";
      obj = Components.classes[cid].createInstance();
      // bind the instance we just created to our interface
      obj = obj.QueryInterface(Components.interfaces.IMyComponent);
    } catch (err) {
      alert(err);
      return;
    }
    var res = obj.Add(3, 4);
    alert('Performing 3+4. Returned ' + res + '.');
  }
};

ボタンをクリックすると、最初の警告ウィンドウが表示されます。[OK] をクリックすると、ウィンドウに次のエラー メッセージが表示されます。

TypeError: Components.classes[cid] は定義されていません

私は何を間違っていますか?xpi ファイル内のどこに .dll ファイルを配置すればよいですか? .idl ファイル? .xpt ファイル?

4

1 に答える 1

2

古いチュートリアルに従っていると思いますが、ほとんどのチュートリアルはGecko 2.0 の XPCOM の変更に更新されていません。しかし、あなたの質問に:

xpi ファイル内のどこに .dll ファイルを配置すればよいですか?

好きな場所で。従来の配置はcomponents/サブディレクトリ内です。

.idl ファイル?

拡張機能の一部ではなく、.xptファイルのみであるべきです。

.xpt ファイル?

繰り返しますが、通常は.dllファイルと同じディレクトリにあります。

ただし、必要な宣言をファイルに追加することが重要ですchrome.manifest。通常は次のようになります。

interfaces components/mycomponent.xpt
binary-component components/mycomponent.dll ABI=WINNT_x86-msvc

コンポーネントコードで何を変更する必要があるかについてのドキュメントも参照してください (必要に応じて、Firefox ソースツリーに例があります)。コンポーネントを使用する Firefox バージョンと一致するGecko SDKバージョンでコンポーネントをコンパイルする必要があることに注意してください。そのため、Firefox 14 では Gecko SDK 14 を使用する必要があります。バイナリ互換性がなくなるため、コンポーネントは Firefox 14 でのみ動作し、Firefox 13 や Firefox 15 では動作しません。

于 2012-08-09T07:45:21.433 に答える