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

Langage Delphi Discussion :

Transtypage iunknown TObject


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2002
    Messages : 121
    Points : 48
    Points
    48
    Par défaut Transtypage iunknown TObject
    Bonjour.
    Je suis en train de passer de D7 à DXE et lors de la conversion d'un projet, je suis tombé sur un truc étrange.

    Le problème est résumé par l'exemple suivant qui affiche 0 sous D7 et 8 sous DXE.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.Button1Click(Sender: TObject);
    var
    myIntf:IUnknown;
    myInt1,myInt2:integer;
    begin
     myIntf:=TinterfacedObject.create;
     myInt1 := integer(pointer(myIntf));
     myInt2 := integer(pointer(TObject(myIntf)));
     showmessage(inttostr(myInt1 - myInt2));
     myIntf :=nil;
    end;
    Il semblerait que sous DXE, l'instruction myIntf:=TinterfacedObject.create renvoie un pointeur vers la partie iunknown de l'objet créé alors que sous D7, elle renvoie un pointeur vers l'objet créé.

    Est ce une modification officielle ou un bug ?

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    c'est une "fonctionnalité", sous XE il est possible de retrouver l'objet à partir de l'interface...donc TObject(myIntf), qui n'a pas de sens sous D7, est valide sous XE et retourne le TInterfacedObject
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2002
    Messages : 121
    Points : 48
    Points
    48
    Par défaut
    Salut.
    Malheureusement pour moi, cela avait du sens pour le type qui a écrit le composant que je fais passer sous dxe (la boite dream company qui nous a vendu le composant n'existe plus)

    Il créé des objets de type idispatch et les stocke dans un tstrings. (d'ou le transtypage) pour les récupérer après. donc lorsqu'il les stocke, il cast sa variable idispatch vers tobject, et quand il les récupére il cast le pointeur stocké dans la tstrings vers un type iunknown.


    La variable iunknow était ensuite redonnée à un composant com via iactiveScripteSite::getItemInfo et là, patatra , violation d'accès.
    J'ai mis un moment avant de comprendre ce qui se passait !

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Citation Envoyé par butch Voir le message
    Salut.
    Malheureusement pour moi, cela avait du sens pour le type qui a écrit le composant que je fais passer sous dxe (la boite dream company qui nous a vendu le composant n'existe plus)

    Il créé des objets de type idispatch et les stocke dans un tstrings. (d'ou le transtypage) pour les récupérer après. donc lorsqu'il les stocke, il cast sa variable idispatch vers tobject, et quand il les récupére il cast le pointeur stocké dans la tstrings vers un type iunknown.


    La variable iunknow était ensuite redonnée à un composant com via iactiveScripteSite::getItemInfo et là, patatra , violation d'accès.
    J'ai mis un moment avant de comprendre ce qui se passait !
    Je pense qu'en passant par un type Pointer intermédiaire ça devrait fonctionner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TObject(Pointer(myIntf))
    ceci dit ce genre de manipulation est a prendre avec des pincettes, dans XE2 64bits, les pointeurs passent en 64bits alors que Integer reste sur 32 bits ! (cf NativeInt qui est selon le cas en 32 ou 64 bits)
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2002
    Messages : 121
    Points : 48
    Points
    48
    Par défaut
    Bonjour.
    Oui, c'est la correction que j'ai faite.

    Merci pour l'info sur xe2. Cela promet encore pas mal de modifs dans ce composant ! Mais sur le cas dont on parle je ne vois pas l'incidence que cela peut avoir ?

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Citation Envoyé par butch Voir le message
    Bonjour.
    Oui, c'est la correction que j'ai faite.

    Merci pour l'info sur xe2. Cela promet encore pas mal de modifs dans ce composant ! Mais sur le cas dont on parle je ne vois pas l'incidence que cela peut avoir ?
    non mais dans ton exemple tu compares les valeurs via des Integer
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2002
    Messages : 121
    Points : 48
    Points
    48
    Par défaut
    ha oui !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. transtypage d'interface en classe
    Par T0ch dans le forum Langage
    Réponses: 5
    Dernier message: 27/05/2004, 19h42
  2. [C++]closure + héritage + transtypage
    Par JEG dans le forum C++Builder
    Réponses: 11
    Dernier message: 30/01/2004, 14h26
  3. Record et TObject
    Par spirale dans le forum Langage
    Réponses: 2
    Dernier message: 13/09/2002, 12h06
  4. [transtypage]PChar et WideString
    Par rbag dans le forum Bases de données
    Réponses: 2
    Dernier message: 05/09/2002, 20h12
  5. TObject->Color et composantes RGB
    Par Flo. dans le forum C++Builder
    Réponses: 10
    Dernier message: 14/06/2002, 17h07

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