[DELPHI] implementation de queryinterface

implementation de queryinterface [DELPHI] - Programmation

Marsh Posté le 10-04-2001 à 01:02:23    

Voilà mon problème : je veux une fiche qui implémente une interface. Seulement, TForm ne descend pas de TInterfacedObject, donc les méthodes queryinterface, _addref et _release ne sont pas implémentées.
 
Est-ce que quelqu'un a une idée de leur implémentation ou connaitrait un bidouillage pour s'en passer ?
 
merci

Reply

Marsh Posté le 10-04-2001 à 01:02:23   

Reply

Marsh Posté le 10-04-2001 à 01:44:37    

a mon avis, il va falloir que tu implementes IUnknown (c-a-d QueryInterface, _AddRef et _Release ) a la main...
 
essaye de te faire une classe TUnknownForm (par exemple)
  TUnknownForm = class (TForm, IUnknown)
qui aura les 3 memes methodes que IUnknown, a savoir:
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
 
pour le code QueryInterface, utilise la fonction GetInterface:
  if GetInterface(IID, Obj) then  
    Result := 0
  else  
    Result := E_NOINTERFACE;
 
pour le code de _AddRef et _Release, incremente et decremente un compteur que tu gereras en interne:

  • _AddRef:

 Inc(fRefCount);
  Result := fRefCount;
 
 

  • _Release:

 Dec(fRefCount);
  Result := fRefCount;
  if fRefCount = 0 then Destroy;
 
par contre, le gros inconvenient, c'est que je ne l'ai pas teste donc si ca se trouve, ca ne marche pas !! ;)
 
ps: sinon, si tu as le code source de la VCL (a partir de l'edition entreprise de delphi, je crois) regarde le source du TInterfacedObject, ca devrait t'aider !


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 10-04-2001 à 09:50:22    

Oh là !!! Y'a plus simple.  
Réimplémenter le fonctionnement de COM, c'est plutot complexe ....
 
Plusieurs solutions :
Soit tu veux que ta fiche communique via COM, auquel cas je te conseille d'ajouter un objet COM à ton projet et qu'il te serve d'intermédiaire dans ta communication.  
(cad Fichier/Nouveau/ActiveX/Objet COM)
 
Soit tu veux que ta feuille puisse s'insérer dans un autre conteneur, auquel cas, tu peux utiliser TActiveForm qui est une fiche et en meme temps un ActiveX.
(cad Fichier/Nouveau/ActiveX/ActiveForm)

Reply

Marsh Posté le 10-04-2001 à 09:52:00    

JWhy, t'as l'air de bien connaitre COM. Tu bosses avec ?
Avec quel langage/bibliothèque ?

Reply

Marsh Posté le 10-04-2001 à 11:37:06    

bat> en fait je veux simplement utiliser les interfaces pour faire une sorte d'héritage multiple : j'ai plusieurs classes qui ne sont pas du tout dans la même hiérarchie et j'aimerais qu'elles implémentent une certaine fonction.
 
JWhy> Merci, j'ai essayé ce que tu proposes, mais ca marche pas. En fait, je crois que le problème vient d'autre part.
J'ai déclaré mon interface de la sorte :  
 
IObservateur=interface(iunknown)
   ['{un ID}']
   procedure UpDateExt
   end;
 
rien de bien bizarre donc, j'ai même essayé plusieurs IDs au hasard. Et c'est là le problème : lors de l'execution :  
 
obj as IObservateur   -> le ID de IObservateur donné par le debugger ne correspond pas à ce que j'ai entré plus haut.
Et à cette ligne, l'execution saute à une adresse où il n'y a rien
 
Bon, je vais continuer à tester dans tous les sens, peutêtre que je trouve autre chose
 
a+

Reply

Marsh Posté le 10-04-2001 à 12:06:16    

Ca y est! J'ai trouvé  :)  
 
En fait, mes objets interfacés sont dans un liste (TList), donc il faut transtyper
 
TInterfacedObject(liste[i]) as IObservateur
 
et ça, ça marche pas...
 
mais TInterfacedForm(liste[i]) as IObservateur : ça marche.
 
Mais du coup, je vois pas trop l'intérêt des interfaces si il faut connaitre le type à la compilation ou si tous mes objets doivent descendre d'un même objet pour avoir droit à l'interface.  
Ca tient à moi ou à Delphi (version 4) ?

Reply

Marsh Posté le 10-04-2001 à 12:12:28    

Alors gtm de retour dans le 10D ?

Reply

Marsh Posté le 10-04-2001 à 12:27:17    

zeltron> Non, c'est pour la semaine prochaine  :na:  
 
Ca doit être michel derriere ce pseudo, non ?

Reply

Marsh Posté le 10-04-2001 à 12:28:51    

gtm a écrit a écrit :

zeltron> Non, c'est pour la semaine prochaine  :na:  
 
Ca doit être michel derriere ce pseudo, non ?




 
Peut être ...
 
Enfoiré tu as pris 5 semaines c'est scandaleux !

Reply

Marsh Posté le 10-04-2001 à 14:33:46    

Effectivement, d'après ce que j'en sais, tu es obligé de  
connaitre le type de l'objet à la compil (même pb en Delphi 5).
 
Ca m'a semblé très con à moi aussi, mais j'ai pas réussi à
contourner le problème...

Reply

Marsh Posté le 10-04-2001 à 14:33:46   

Reply

Marsh Posté le 10-04-2001 à 23:34:29    

bat a écrit a écrit :

JWhy, t'as l'air de bien connaitre COM. Tu bosses avec ?
Avec quel langage/bibliothèque ?




Oui, je bosse avec COM sous Delphi depuis 2/3 ans maintenant...


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 10-04-2001 à 23:41:13    

gtm a écrit a écrit :

Ca y est! J'ai trouvé  :)  
 
En fait, mes objets interfacés sont dans un liste (TList), donc il faut transtyper
 
TInterfacedObject(liste[i]) as IObservateur
[...]




 
et sinon, t'as essaye d'utiliser le TInterfaceList ?
 
tu devrais pouvoir recuperer directement ton (liste[i] as IObservateur ) sans avoir besoin de le transtyper (et donc sans avoir besoin de savoir si c'est un TInterfacedObject ou un TInterfacedForm)...

 

[edit]--Message édité par JWhy--[/edit]


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed