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

VB.NET Discussion :

Cast d'un objet COM


Sujet :

VB.NET

  1. #1
    Membre éclairé Avatar de r.morel
    Homme Profil pro
    Dessinateur CAO
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur CAO
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Points : 667
    Points
    667
    Par défaut Cast d'un objet COM
    Bonjour,
    Je travail sur AddIn Excel VSTO avec VS2017.
    J'ai créé une Class:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Imports Microsoft.Office.Interop.Excel
    Public Class ClasseurNomenclature
        Inherits WorkbookClass
     
    '(...)
     
    End Class
    Ensuite lors de l'utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public MyClasseurNom As ClasseurNomenclature
    MyClasseurNom = Globals.ThisAddIn.Application.ActiveWorkbook
    Je rencontre l'erreur sur la seconde ligne :
    L'exception System.InvalidCastException s'est produite
    HResult=0x80004002
    Message=Impossible d'effectuer un cast d'un objet COM de type 'Microsoft.Office.Interop.Excel.WorkbookClass' en type de classe 'ExcelAddIn1.ClasseurNomenclature'. Les instances de types qui représentent des composants COM ne peuvent pas être castées en types différents représentant des composants COM ; toutefois, elles peuvent être castées en interfaces tant que le composant COM sous-jacent prend en charge les appels QueryInterface pour l'IID de l'interface.
    Source=<Impossible d'évaluer la source de l'exception>
    Arborescence des appels de procédure :
    <Impossible d'évaluer l'arborescence des appels de procédure de l'exception>

    Merci par avance.
    Merci de ainsi que d'utiliser les boutons et

  2. #2
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Bonjour,

    Tu ne peux pas caster un objet "parent" en objet "enfant".
    Tu peux seulement le faire dans l'autre sens.
    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            Dim myObject As New Object
            Dim myException As New Exception()
            myObject = myException ' Marche
            myException = myObject ' Ne marche pas
            myObject = New Exception() ' Marche 
            myException = myObject ' Marche

  3. #3
    Membre éclairé Avatar de r.morel
    Homme Profil pro
    Dessinateur CAO
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur CAO
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Points : 667
    Points
    667
    Par défaut
    Salut,
    Merci pour ta réponse.
    J'avoue cependant être un peu dépassé.
    Pour tenter de clarifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Dim myObject As New Object 'Parent
    Dim myException As New Exception() 'Enfant
     
    myObject = myException ' Parent = enfant - Marche
    myException = myObject ' Enfant = parent - Ne marche pas 
     
    myObject = New Exception() ' Parent = enfant - Marche
    myException = myObject ' Enfant = parent - Marche
    Pourquoi le second Enfant = parent fonctionne ? A cause du new ?

    Devrais-je alors faire cela ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Public MyClasseurNom As New ClasseurNomenclature
    MyClasseurNom = Globals.ThisAddIn.Application.ActiveWorkbook
    Merci de ainsi que d'utiliser les boutons et

  4. #4
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    En fait il faut bien distinguer deux choses, la variable qui va contenir l'objet et l'objet lui même (l'instance de la classe).

    On type une variable pour dire ce qu'elle va contenir.
    Quand tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public MyClasseurNom As New ClasseurNomenclature
    C'est l'équivalent de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public MyClasseurNom As ClasseurNomenclature ' Création de la variable
    MyClasseurNom = New ClasseurNomenclature 'création de l'objet que l'on assigne à la variable
    Le soucis est qu'en déclarant la variable d'un type enfant, tu dis que tu peux accéder à tous ces membres public (friend et protected aussi).
    Donc si tu as rajouté des méthodes a ce type "enfant", elle seront accessible sur cette variable. Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyClasseurNom.MaNouvelleMethodeEnfant
    or si tu essayes d'attribuer à cet objet un type parent, ce dernier n'a pas cette méthode.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MyClasseurNom = Globals.ThisAddIn.Application.ActiveWorkbook
    MyClasseurNom.MaNouvelleMethodeEnfant ' N'existe pas sur la classe parent contenue dans ma variable
    Ça n'a donc pas de sens et il est normal que le compilateur l'interdise.

    Par contre dans l'autre sens pas de soucis. L'enfant expose tous les membres de son parent. Tu peux donc mettre un enfant dans une variable parent. Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim myObj as Object = New ClasseurNomenclature
    debug.WriteLine(obj.GetHashCode()) ' Marche car la variable de type Objet à cette méthode et son enfant aussi de part l'héritage
    debug.WriteLine(obj.UneFonctionDeClasseurNomenclature()) ' Ne marche pas car pas connue de la variable de type objet
    debug.WriteLine(CType(obj,ClasseurNomenclature).UneFonctionDeClasseurNomenclature()) ' marche car on lui dit le type que c'est et que c'est bien une méthode de ce type
    debug.WriteLine(CType(obj,WorkbookClass).UneFonctionDeClasseurNomenclature()) ' ne marche pas car cette méthode n'existe pas sur la classe parent
    myObj = new WorkbookClass ' Marche car WorkbookClass est bien enfant d'Objet
    debug.WriteLine(CType(obj,ClasseurNomenclature).UneFonctionDeClasseurNomenclature()) ' ne marche pas car l'objet contenu dans obj n'est pas de ce type ou d'un de ces type enfants mais bien un parent
    Il n'y pas donc pas moyen de mettre le parent Globals.ThisAddIn.Application.ActiveWorkbook dans ta variable enfant. Avec ou sans le new.

  5. #5
    Membre éclairé Avatar de r.morel
    Homme Profil pro
    Dessinateur CAO
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur CAO
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Points : 667
    Points
    667
    Par défaut
    beaucoup pour ta réponse constructive.

    En fait il faut bien distinguer deux choses, la variable qui va contenir l'objet et l'objet lui même (l'instance de la classe).
    Je pensais faire la différence. Mais en fait je me trompait!


    Du coup quel conseil pour ajouter des fonctionnalités spécifiques à la classe WorkBook ?
    Qu'en pensez vous si j'englobe la classe dans mon objet spécifique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public Class ClasseurNomenclature
    Public Property ClasseurExcel As Workbook
    Du coup je peux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public MyClasseurNom As New ClasseurNomenclature
    MyClasseurNom.ClasseurExcel = Globals.ThisAddIn.Application.ActiveWorkbook
    Merci de ainsi que d'utiliser les boutons et

  6. #6
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    C'est effectivement une solution. Ça s'appelle l'encapsulation.
    Dans le new tu peux mettre un paramètre de type Workbook et initialiser directement ta propriété dans le constructeur. De cette manière tu obliges de construire correctement ton objet ClasseurNomenclature et tu t'assures de ne pas oublier d'affecter la propriété.

  7. #7
    Membre éclairé Avatar de r.morel
    Homme Profil pro
    Dessinateur CAO
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur CAO
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Points : 667
    Points
    667
    Par défaut
    Citation Envoyé par Sankasssss Voir le message
    Dans le new tu peux mettre un paramètre de type Workbook et initialiser directement ta propriété dans le constructeur.
    C'est ce que j'ai fait.
    Par contre je ne savais pas que je faisais de l'encapsulation.

    En tous cas merci beaucoup de ta patience et de tes conseils...
    Bonne fin de jurnée
    Merci de ainsi que d'utiliser les boutons et

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

Discussions similaires

  1. Impossible d'effectuer un cast d'un objet COM
    Par lazerbo dans le forum Développement Windows
    Réponses: 1
    Dernier message: 27/07/2016, 10h13
  2. Réponses: 21
    Dernier message: 16/09/2013, 22h00
  3. Cast d'un objet COM via réflection
    Par GreatDeveloperOnizuka dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 04/04/2013, 10h10
  4. cast avec des objets COM
    Par stardeath dans le forum Visual C++
    Réponses: 5
    Dernier message: 20/01/2010, 01h52
  5. Désenregistrement d'Objets COM sous Windows
    Par barthelv dans le forum Windows
    Réponses: 2
    Dernier message: 21/05/2003, 15h11

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