implementation de queryinterface [DELPHI] - Programmation
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:
Inc(fRefCount);
Result := fRefCount;
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 !
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)
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 ?
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+
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) ?
Marsh Posté le 10-04-2001 à 12:27:17
zeltron> Non, c'est pour la semaine prochaine
Ca doit être michel derriere ce pseudo, non ?
Marsh Posté le 10-04-2001 à 12:28:51
gtm a écrit a écrit : zeltron> Non, c'est pour la semaine prochaine Ca doit être michel derriere ce pseudo, non ? |
Peut être ...
Enfoiré tu as pris 5 semaines c'est scandaleux !
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...
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...
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]
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