Bilden eines C ++ XPCOM Bestandteils in Windows

Bilden eines C ++ XPCOM Bestandteils in Windows
Copyright © briankrausz.com
For original English text, go to: http://briankrausz.com
Translated by A.Romanova

Ich habe mich gelehrt, Firefox Erweiterungen für den letzten paar Wochen zu schreiben, und bin interessiert für XPCOM Bestandteile geworden. Leider konnte ich keinen passenden (und neun) Zusammenfassung von ihnen finden, und musste 3 oder 4 Tage verbringen, zusammen verschiedene Lernprogramme mit Kopfsteinen pflasternd, so habe ich geglaubt, dass es Zeit ist, um diejenige zu schreiben.

Was ist XPCOM?

XPCOM ist eine sprachagnostische Kommunikationsplattform, die in Mozilla Produkten (und einige andere zufällige Stücke der Software) verwendet ist, dem Code (spezifisch Erweiterungen) erlauben, in einem großen Vielfalt von Sprachen geschrieben zu werden.

Warum will ich XPCOM verwenden?

Es gibt zwei Weisen, XPCOM “zu verwenden”. Erstens können Sie Funktionen durch XPCOM nennen. Zum Beispiel Firefox Lesezeichen-Dienstleistung verwendet eine XPCOM-Schnittstelle. So, um mit diesem Dienst von Javascript aufeinander zu wirken, würden Sie etwas tun wie:

var bmarks = Components.classes["@mozilla.org/browser/bookmarks-service;1"].getService();
bmarks.QueryInterface(Components.interfaces.nsIBookmarksService);
bmarks.addBookmarkImmediately("http://www.mozilla.org","Mozilla",0,null)

Es gibt viele Lehrnprogrammen beim machen davon, weil es mehr übliche Anwendung für XPCOM gibt, so werde ich in kein Detail darauf hier eintreten.

Der zweite Weg ist eine XPCOM Dienstleistung zu schreiben. Das ist, was dieser Lehrnprogramm bedeckt. Manchmal brauchen Sie Extrafunktionalität, Geschwindigkeit, oder wollen gerade in eine Bibliothek punktgleich sein, die eine verschiedene Sprache verlangt. Meistens ist das C ++, aber es gibt auch JavaXPCOM und PyXPCOM (und wahrscheinlich viele andere). Ich werde über C ++ sprechen, da es ist, was ich für mein Projekt gebraucht habe.

Warnungen

  1. Bevor Sie dadurch stapfen: fast sicher befinden Sie sich am falschen Platz. Firefox Erweiterungen sind gewöhnlich alle Javascript. Wenn Sie JS verwenden können, um zu tun, was Sie wollen, halten Sie jetzt an. Es gibt kein Bedürfnis, die Kompliziertheit eines XPCOM Bestandteils durchzugehen, wenn Sie gerade JS verwenden können. Lesen Sie einen Lehrnprogramm über das Schreiben Erweiterungen und beginnen zu arbeiten.
  2. Es gibt etwas, das ctypes genannt ist, das zu FF 3.7 kommt, das davon viel einfacher machen kann. Ich habe das überhaupt nicht berührt, aber das gilt in Betracht zu ziehen, ob Sie auf die Funktionalität warten können, und nur brauchen in einen besonderen DLL für etwas Funktionalität zu verbinden. Kurz gesagrt, XPCOM kann die schwierigere Weise werden, C ++ Funktionen aus FF Erweiterungen zu nennen.

Meine Einstellung

  • Windows 7
  • Visual C ++ Express 2008 (frei von Microsofts Website)
  • Firefox 3.6 (Gecko 1.9.2)
  • Ein UUID oder GUID Generator. Das ist ein einzigartiger (gelesen: Zufällig) Personalausweis, der Ihren app zur Welt identifiziert. Windows und Linux haben Werkzeuge, um das (guidgen & uuidgen, beziehungsweise) zu erzeugen, oder Sie können verschiedene Online-Generatoren ( Mozilla verbindet sich zu mehreren) finden. Ich empfehle dieses, da es Ihnen den C ++ verschlüsselte Form auch gibt, die Sie brauchen werden. Sie brauchen zwei verschiedene UUIDs: ein für Ihre Schnittstelle und ein für Ihren Bestandteil.
  • Fähigkeit, C ++ zu lesen und zu verstehen

Beispielcode

Wenn Sie nicht den Ehrnprogrammen nicht durchgehen und nur wollen allse arbeiten, dann laden Sie diesen Beispielcode herunter. Folgen Sie gerade Schritt #1 der Lehrprogramme, dann überzeugen Sie sich Ihr Gecko SDK Verzeichnis wird direkt im bauen Schritt gesetzt, und Sie können auf vom grössten Teil dieses Artikels wehen.

Die Amleitung

Das wird größtenteils vom Alex Sirota Lehrbprogramme  paraphrasiert, aber er ist seit 2005 nicht aktualisiert worden und ist ein bisschen überholt. Dieser neue sollte aus dem Kasten für FF 3.6 arbeiten.

Dieser Tutorenkurs wird einen Bestandteil schaffen, genannten

MyComponent

Mit einer Funktion

Add

Das wird 2 Zahlen übernehmen, und dann überraschenderweise die Summe zurückzugeben

1. Laden Sie Gecko SDK für Ihre Firefox Version herunter. Ich habe 1.9.2 für FF 3.6 verwendet.

2. Erstellen Sie ein idl File

IMyComponent.idl

Mit den folgenden(durchersetzen

***IUID***

Mit Ihrer Schnittstelle UUID):

#include "nsISupports.idl"

[scriptable, uuid(***IUID***)]
interface IMyComponent : nsISupports
{
  long Add(in long a, in long b);
};

Diese Datei ist eine sprachagnostische Schnittstelle-Definition, darüber können Sie hier mehr hier lesen.

3. Erzeugen Sie den Schnittstelle-dateikopf und tippen lib-Dateien aus der Schnittstelle-Definitionsdatei. Nehmen an, dass Sie haben den Gecko SDK dazu herausgezogen

C:\xulrunner-sdk\

, führen Sie die folgenden Befehle (aus dem Verzeichnis, das Sie gespart haben

IMyComponent.idl

zu):

C:\xulrunner-sdk\sdk\bin\xpidl.exe -m header -I C:\xulrunner-sdk\idl .\IMyComponent.idl
C:\xulrunner-sdk\sdk\bin\xpidl.exe -m typelib -I C:\xulrunner-sdk\idl .\IMyComponent.idl

Das wird schaffen

IMyComponent.h

und

IMyComponent.xpt,

beziehungsweise.

4. IMyComponent.h

hat zwei snippits des Codes, den Sie für die folgenden zwei Dateien verwenden können. Alles dazwischen

/* Header file */

und

/* Implementation file */

kann verwendet für

MyComponent.h:

i. Fangen durch das Einfügen des doppelten Einschließungsschutzcodes an, und das Recht schließt ein:

#ifndef _MY_COMPONENT_H_
#define _MY_COMPONENT_H_

#include "IMyComponent.h"

ii. Fügen Sie die folgenden Linien hinzu, die Ihren Komponentenname, ID Vetrag, und CUID hinzu(wo *** CUID *** ist C ++-Komponentenvorlage UUID, der Form {0×12345678, 0x9abc, 0xdef0, {0×12, 0×34, 0×56, 0×78, 0x9a, 0xbc, 0xde, 0xf0}}):

#define MY_COMPONENT_CONTRACTID "@example.com/XPCOMSample/MyComponent;1"
#define MY_COMPONENT_CLASSNAME "A Simple XPCOM Sample"
#define MY_COMPONENT_CID ***CUID***

iii. Koppieren in der snippet Form:

IMyComponent.h

, ersetzen alle Exemplaren von

_MYCLASS_

mit der Namen von Ihren Komponenten(

MyComponent

).

iv. beenden Sie den doppelten Einschließungsschutzcode mit

#endif //_MY_COMPONENT_H_

5. Alle zwischen

/* Implementation file */

und

/* End of implementation class template. */

kann verwendet sein für

MyComponent.cpp

:

i. Fang durch das Einfügen an, Recht schließt ein:

#include "MyComponent.h"

ii. Kopieren ind snippet Form

IMyComponent.h

, ersetzen alle Exemplaren von

_MYCLASS_

mit der Namen von Ihren Komponenten(

MyComponent

).

iii. Beitragen Sie einige Implementation zu

Add

Methode. Ich habe durchersetzt

mit

*_retval = a + b;
return NS_OK;

6. Schaffen Sie Ihre Modul-Definitionsdateien:

#include "nsIGenericFactory.h"
#include "MyComponent.h"

NS_GENERIC_FACTORY_CONSTRUCTOR(MyComponent)

static nsModuleComponentInfo components[] =
{
    {
       MY_COMPONENT_CLASSNAME,
       MY_COMPONENT_CID,
       MY_COMPONENT_CONTRACTID,
       MyComponentConstructor,
    }
};

NS_IMPL_NSGETMODULE("MyComponentsModule", components)

Sie haben jetzt alle gebrauchten Dateien einen XPCOM Bestandteil bauen:

IMyComponent.h
IMyComponent.idl
IMyComponent.xpt
MyComponent.cpp
MyComponent.h
MyComponentModule.cpp

Jetzt kommt der harte Teil: Bekommen des verdammten Dings zu bilden.

Bilden des Codes

OK, es ist wirklich nicht hart, seitdem ich den grössten Teil der Laufarbeit für Sie getan habe. Das Annehmen, dass Sie Visuellen C ++ 2008 verwenden, hier gibt es die Einstellungen, die Sie brauchen (wieder Annehmen

C:\xulrunner-sdk

ist, wo Ihr Gecko SDK es gibt). In

Project->Properties:

Configuration Properties
  General
    Configuration Type: .dll
  C/C++
    General
      Additional Include Directories: C:\xulrunner-sdk\include
    Preprocessor
      Preprocessor Definitions: XP_WIN;XP_WIN32;XPCOM_GLUE_USE_NSPR
  Linker
    General
      Additional Library Directories: C:\xulrunner-sdk\lib
    Input
      Additional Dependencies: nspr4.lib xpcom.lib xpcomglue_s.lib

Wenn Sie die idl Datei in Ihr Projekt stellen, versichern Sie sich das  “Ausgeschlossen aus Bauen” auszuzeichen, in seinen Eigenschaften … wollen wir nicht VS es zu berühren.

Durchqueren Sie Ihre Finger, beten Sie zu beliebiger Gottheit, die Sie darin glauben, und den bauen Knopf schlagen. Wenn es nicht gearbeitet hat, teilt mir mit, warum in den Anmerkungen und ich versuchen werde, eine Fehlerbeseitigungsabteilung zu bauen.

Installation/Prüfung des Codes

1. Kopieren Sie zwei Dateien dazu

C:\Program Files\Mozilla Firefox\components

:

  • DLL das erzeugte Bauen
  • IMyComponent.xpt

2. Normalerweise, wenn das als ein Teil einer Erweiterung installiert würde, würde er dieses Verzeichnis automatisch suchen und diese Dateien finden. Aber jetzt müssen wir ein Erfrischen zwingen. Löschen

xpti.dat.

und

compreg.dat

aus Ihrem Profil-Verzeichnis (wird FF sie auf dem folgenden Wiederanfang regenerieren)

3. Schließen Sie Firefox und öffnen Sie ihn mit dieser Testdatei (

MyComponentTest.html

in einem Beispielcode):

<html>
<script type="text/javascript">
function MyComponentTestGo() {
	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 + '.');
}
</script>
<body>
<button onclick="MyComponentTestGo();">Go</button>
</body>
</html>

4. Ein letztes Mal: Durchqueren Sie Ihre Finger, beten Sie zu beliebiger Gottheit, die Sie darin glauben, und die Taste Go schlagen. Wenn es nicht gearbeitet hat, teilt mir mit, warum in den Anmerkungen und ich versuchen werde, eine Fehlerbeseitigungsabteilung zu bauen.

Hoffentlich räumt das ab, was wie viel Verwirrung zu mir ausgesehen hat. Ich werde das Aktualisiertes zum besten von meinen geistigen Anlagen halten, und hoffentlich wird es fortsetzen, für langem nützlich zu sein.