2010-11-25 3 views
2

In Erweiterung zu this Frage, ich denke, ich werde am besten zeigen, was ich bisher habe. Was ich versuche, ist eine Firefox-Erweiterung mit Delphi zu erstellen, die mit den Firefox-Versionen der Zukunft funktioniert, die eine exportierte NSModule-Struktur und nicht mehr eine NSGetModule-Funktion verwenden.Portierung Mozillas NSModule nach Delphi

Haupt Fragen, die ich mit für den Moment bin zu kämpfen ist:

  • Ist der folgende Code korrekt? Ich mag mich irren, wie die Zeiger und Arrays von Datensätzen funktionieren.
  • Wie debuggen Sie das? Wenn ich es erstelle und es läuft, dann bin ich mir sicher, dass es funktioniert, aber beim Debuggen meiner Bibliothek kann ich nur überprüfen, ob mein Init-Code seine Aufgabe erfüllt. (Und jetzt, Firefox 3.6 scheint nicht meinen @mozilla.org/network/protocol;1?name=xxm Vertrag abholen)

Der Code, den ich in dem Hafen bin versucht, hier ist: http://mxr.mozilla.org/mozilla-central/source/xpcom/components/Module.h

type 
    TConstructorProcPtr=function(aOuter:nsISupports;const aIID:TGUID;var aResult:pointer):nsresult; 
    TLoadFuncPrt=function:nsresult; 
    TUnloadFuncPrt=procedure; 
    TCIDEntry=record 
    cid:TGUID; 
    service:boolean; 
    getFactoryProc:pointer;//TGetFactoryProcPtr; 
    constructorProc:TConstructorProcPtr; 
    end; 
    TContractIDEntry=record 
    contractid:PChar; 
    cid:TGUID;//PGUID? 
    end; 
    TCategoryEntry=record 
    category,entry,value:PChar; 
    end; 

    TXPCOMModule=packed record 
    kVersion:integer;//=1; 
    mVersion:cardinal;//kModuleVersion 
    mCIDs:^TCIDEntry;//pointer to first in array, last should be nil 
    mContractIDs:^TContractIDEntry;//pointer to first in array, last should be nil 
    mCategoryEntries:^TCategoryEntry;//pointer to first in array, last should be nil 
    getFactoryProcPtr:pointer;//TGetFactoryProcPtr; 
    loadProc:TLoadFuncPrt; 
    unloadProd:TUnloadFuncPrt; 
    end; 
+1

Ich habe keine Ahnung, worum es bei Ihrer zweiten Frage geht. Wie Sie wissen, funktioniert Stack Overflow am besten, wenn Sie nur eine Frage gleichzeitig stellen. Könnten Sie bitte erläutern, wie Ihre Debugging-Frage mehr mit Ihrer C++ - Übersetzungsfrage zusammenhängt? –

+0

Die beiden Fragen sind sehr eng miteinander verwandt. Ich habe einige exportierte Daten aus meinem Projekt hochgeladen, aber ich nehme an, dass es Firefox-Code gibt, der diesen Code verbraucht, und ich nehme an, dass ich theoretisch durch FireFox gehen könnte, während er meine NSModule-Daten verwendet. Die Sache ist, ich habe keine Ahnung, wie man eine Umgebung aufbaut, die die Firefox-Quelle laden und einen Debugger damit ausführen kann. (Ich bin mit Delphi aufgewachsen, da ist ein Paket) –

Antwort

1

Sie müssen an Sicherheit grenzender Wahrscheinlichkeit die cdecl Aufrufkonvention auf alle Ihre prozedur und Funktionszeiger Erklärungen:

TConstructorProcPtr = function(aOuter: nsISupports; const aIID: TGUID; var aResult: Pointer): nsresult; cdecl; 
TLoadFuncPrt = function: nsresult; cdecl; 
TUnloadFuncPrt = procedure; cdecl; 

ich nehme an, Sie nsISupports als Delphi inter deklariert haben Gesicht. Andernfalls müssen Sie sicherstellen, dass der obige Parameter aOuter ein Zeiger ist, wie es in dem C++ - Code ist.

Für TContractIDEntry und alle anderen Orte, an denen Sie PChar verwenden, rate ich Ihnen stattdessen PAnsiChar zu verwenden. Die Größe von Delphi Char Typ vor ein paar Jahren geändert, aber die C++ char ist und wird immer ein Byte sein, so Delphi den Ein-Byte-Zeichen-Typ explizit verwenden. Auch Ihr Kommentar, der sich fragt, ob das Feld cid als PGUID deklariert wird, war korrekt; Sternchen bedeutet Zeiger.

TContractIDEntry = record 
    contractid: PAnsiChar; 
    cid: PGUID; 
end; 

Das kVersion Feld sollte kein Mitglied des Datensatzes sein, das Sie erklären. In C++ ist es ein statisches Mitglied, was bedeutet, dass es keinen Platz in der Struktur selbst einnimmt; Es wird von allen Instanzen dieses Typs geteilt. Es entspricht einem Klassenfeld in einer Delphi-Klasse, aber ich denke nicht, dass Datensätze diese Funktion bieten. Machen Sie es zu einer Variablen auf Einheitenebene anstatt zu einem Feld.

+2

Ich vergesse immer wieder zu erwähnen, wie ich nsISupports in Delphi nutzen kann, dank jemand (der meine Anrufe nicht beantwortet), können Sie einfach das 'grundlegende' Interface zuordnen Methoden über die nsISupports-Methoden: http://d-gecko.svn.sourceforge.net/viewvc/d-gecko/trunk/GeckoSDK/nsXPCOM.pas?revision=10&view=markup#l1095 –