2010-11-25 3 views
2

En extension à this question, je suppose que je vais mieux montrer ce que j'ai jusqu'à présent. Ce que j'essaie de faire est de créer une extension Firefox avec Delphi, qui fonctionnera avec les versions futures de Firefox qui utiliseront une structure NSModule exportée, et non plus une fonction NSGetModule.Portage NSModule mozilla à Delphi

Les principales questions que je me bats avec pour le moment est:

  • est le code ci-dessous correct? Je peux me tromper avec le fonctionnement des pointeurs et des tableaux d'enregistrements.
  • Comment déboguer cela? Si je le construis et qu'il fonctionne alors je suis sûr que ça marchera, mais dans le débogage de ma bibliothèque, je peux seulement vérifier si mon code init fait son travail. (Et semble maintenant, Firefox 3.6 ne pas prendre mon contrat @mozilla.org/network/protocol;1?name=xxm)

Le code que je suis en train de port est ici: 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

Je n'ai aucune idée de ce qu'est votre deuxième question. Comme vous le savez, Stack Overflow fonctionne mieux lorsque vous ne posez qu'une seule question à la fois. Pourriez-vous préciser comment votre question de débogage est plus liée à votre question de traduction C++? –

+0

Les deux questions sont très étroitement liées. J'ai mis quelques données exportées de mon projet, mais je suppose qu'il y a du code de Firefox qui consomme ce code, et je suppose que je pourrais théoriquement passer par FireFox pendant qu'il utilise mes données NSModule. Chose est je n'ai aucune idée comment configurer un environnement qui peut charger la source firefox, et exécuter un débogueur avec elle. (J'ai grandi avec Delphi, il s'agit d'un forfait) –

Répondre

1

Vous devez certainement le cdecl convention d'appel à toutes vos déclarations de procédure- et fonction pointeur:

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

Je suppose que vous avez déclaré nsISupports comme entre Delphi visage. Sinon, vous devez vous assurer que le paramètre aOuter ci-dessus est un pointeur tel qu'il est dans le code C++. Pour TContractIDEntry, et tous les autres endroits où vous utilisez PChar, je vous conseille d'utiliser PAnsiChar à la place. La taille du type Char de Delphi a changé il y a quelques années, mais le C++ char est et sera toujours un octet, donc utilisez explicitement le type de caractère octet de Delphi. En outre, votre commentaire se demandant si déclarer le champ cid comme PGUID était correct; astérisque signifie pointeur.

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

Le champ kVersion ne doit pas être membre du dossier que vous déclarez. En C++, c'est un membre statique, ce qui signifie qu'il n'occupe aucun espace dans la structure elle-même; c'est partagé par toutes les instances de ce type. C'est l'équivalent d'un champ de classe dans une classe Delphi, mais je ne pense pas que les enregistrements offrent cette fonctionnalité. Faites-en une variable au niveau de l'unité au lieu d'un champ.

+2

Je n'oublie pas de mentionner comment j'utilise nsISupports en Delphi, grâce à quelqu'un (qui ne répond pas à mes appels), vous pouvez juste cartographier la IInterface «basique» méthodes sur les méthodes nsISupports: http://d-gecko.svn.sourceforge.net/viewvc/d-gecko/trunk/GeckoSDK/nsXPCOM.pas?revision=10&view=markup#l1095 –