IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

Passage d'un objet en OleVariant


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 70
    Points : 46
    Points
    46
    Par défaut Passage d'un objet en OleVariant
    Bonjour,
    j'ai une class TRate descendant de IDispatch et TAutuObject;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    Type
        IRate = interface(IDispatch)
        ['{60B5A5D1-5BA9-4D28-BBF9-DD5BE2B83ED2}']
        function Get_Minimum: Double; safecall;
        procedure Set_Minimum(Value: Double); safecall;
        function Get_Maximum: Double; safecall;
        procedure Set_Maximum(Value: Double); safecall;
        property Minimum: Double read Get_Minimum write Set_Minimum;
        property Maximum: Double read Get_Maximum write Set_Maximum;
      end;
     
      TRate = class(TAutoObject, IRate)
      protected
        function Get_Maximum: Double; safecall;
        function Get_Minimum: Double; safecall;
        procedure Set_Maximum(Value: Double); safecall;
        procedure Set_Minimum(Value: Double); safecall;
      public
        fMaximum,fMinimum:double;
        destructor Destroy; override;
      end;
    J'ai ensuite g_Rate un tableau d'objet de type TRate. Je dois y accéder via IEnumerator et la Property Current.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function TRateEnum.Get_Current: OleVariant;
    begin
      result:= g_Rate[fAxe,fIndex-1];
    end;
    Le retour de Get_Current est standardisé car c'est un descendant de IEnumerator, donc retour par OleVariant. J'obtiens une erreur de compilation car le type TRate est incompatible avec OleVariant.
    Je suis un peu coincé.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 70
    Points : 46
    Points
    46
    Par défaut
    J'ai trouvé une solution mais je ne sais pas pourquoi ça marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function TRateEnum.Get_Current: OleVariant;
    begin
      result:= g_Rate[fAxe,fIndex-1] as IRate;
    end;
    Les interfaces et moi ce n'est pas encore gagné!!

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 149
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par michastro Voir le message
    J'ai trouvé une solution mais je ne sais pas pourquoi ça marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function TRateEnum.Get_Current: OleVariant;
    begin
      result:= g_Rate[fAxe,fIndex-1] as IRate;
    end;
    Les interfaces et moi ce n'est pas encore gagné!!
    A mon avis ça passe car tu ne renvoies plus une instance sur une classe mais une interface qui hérite de IDispatch, Ce qui est un type "standardisé COM" contrairement au type "TRate" qui tu as implémenté.
    En effet comme tu peux transiter des données entres des processus différents (voir distants) les types doivent êtres "standardisés" et non spécifiques à un langage. Passer par une interface COM (= présence d'un GUID, permettant de référencer et donc retrouver les propriétés de ton interface à distance), qui de plus hérite de IDispatch (permet des appels "résolus au runtime" = "late biding") assure que tu utilises un type standard. Seulement le récepteur ne manipulera pas l'instance mais une interface sur cette instance...

    Si tu veux passer une instance directement et non une interface cela reste possible mais cela nécessite :
    - que le type soit connu des deux côtés (émetteur/récepteur), donc que les deux processus / applis soient développés avec le même langage
    - avoir une méthode qui convertit ton objet en "OleVariant"
    => en général l'idée est d'hériter pour cela de "TPersitent" qui permet de rendre ton objet sérialisable, tu peux alors l'enregistrer/le charger dans/depuis un "TStream". Ensuite il te reste à faire une conversion TStream => OleVariant et réciproquement (un var array of bytes fonctionne très bien pour ça). Tu écris ainsi une méthode "SaveToOleVariant" et une méthode "CreateFromOleVariant" par exemple...
    ==> attention si tes deux processus ne sont pas de la même build/compil la définition interne de ton objet peut avoir évoluée, ce qui peut provoquer des erreurs à l'utilisation de "CreateFromOleVariant", c'est pourquoi il est conseillée de maintenir un système de versionning dans tous les objets "sérialisables"

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/08/2008, 22h19
  2. passage d'un objet en paramètre
    Par g30167 dans le forum C++
    Réponses: 2
    Dernier message: 14/12/2007, 23h25
  3. Passage d'un objet
    Par whorian dans le forum C++
    Réponses: 5
    Dernier message: 23/09/2007, 17h23
  4. Passage d'un objet entre deux classes
    Par ericlemoustic dans le forum Langage
    Réponses: 2
    Dernier message: 13/10/2006, 09h58
  5. Réponses: 20
    Dernier message: 23/09/2005, 13h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo