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

VC++ .NET Discussion :

COM en C++ et Enumerateur


Sujet :

VC++ .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut COM en C++ et Enumerateur
    Bonjour,

    Je developpe une petite application en COM/C++. J'aimerai profiter de cette interface en C# ou VB, avec le for each. Pour cela il faut utiliser les enumerateurs. J'ai trois interfaces : Global, Item, ItemCollection.
    Je m'inspire du Windows Script Host Object Model (IWshRuntimeLibrary):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        interface IFileCollection : IDispatch {
            [id(00000000), propget]
            HRESULT Item(
                            [in] VARIANT Key, 
                            [out, retval] IFile** ppfile);
            [id(0xfffffffc), propget, restricted, hidden]
            HRESULT _NewEnum([out, retval] IUnknown** ppenum);
            [id(0x00000001), propget]
            HRESULT Count([out, retval] long* plCount);
        };
    Mais je me demande comment cette interface est codé. Surtout ce que renvoie la fonction _NewEnum: un IEnumUnknown, un IEnumVARIANT ou un enum que je definis ?
    En tout cas j'ai tout tester et rien ne marche le for each de C#.
    J'ai touver des exemples pour IEnumVARIANT, mais je ne peut pas metre mon interface ITem dedans ?

    Merci pour toute info.

  2. #2
    Membre chevronné Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par défaut
    Bon pour info. J'ai presque reussi. Voici le code de l'interface
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    interface ICollection : IDispatch {
        [id(DISPID_VALUE), propget]
    	HRESULT Item( [in] VARIANT Key, [out, retval] IMonItem** ppfile);
        [id(DISPID_NEWENUM), propget, restricted, hidden]
        HRESULT _NewEnum([out, retval] IUnknown** ppenum);
        [id(0x00000001), propget]
        HRESULT Count([out, retval] long* plCount);
    };
    Pour le code de la fonction _NewEnum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    STDMETHOD (get__NewEnum)(IUnknown** ppUnk)
    	{
    		EnumVARIANT<AviInfo> *p = new EnumVARIANT<AviInfo>(&m_data);
    		p->AddRef();
    		*ppUnk = (IUnknown*)(p);
    		return S_OK;
    	}
    Mon EnumVARIANT est une classe template que j'ai ecrit qui derive de l'interface IEnumVARIANT, dont voici l'implementation de la focntion Next :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    STDMETHOD (Next)(ULONG celt,
    		VARIANT *rgVar,
    		ULONG* pceltFetched)
    	{
    		rgVar->vt =  VT_DISPATCH | VT_BYREF;
    		rgVar->ppdispVal = new IDispatch*;
    		( *m_it )->QueryInterface( IID_IDispatch,
                          (void**)rgVar->ppdispVal );
    		m_it++;
    		if ( pceltFetched )
    			*pceltFetched = celt;
    		return S_OK;
    	}
    On remarque de l'on fait un new IDispatch* j'ai mit longtemp pour comprendre cela car aucun expemple sur le net le fesait. Donc avec ce code le parcourt d'une collection ce fait avec un for each ( C# et VisualBasic ).
    Par contre l'acces a un seul element par crochet, qui appelle la fonction get_Item leve une erreure !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    STDMETHOD(get_Item)(VARIANT Index, IMonItem** pvar)
    {
        pvar = (IMonItem**)new IMonItem*; // ?
        m_data( Index.intVal )->QueryInterface( IID_IMonItem, (void**)pvar );
        return S_OK;
    }
    Merci d'avance

Discussions similaires

  1. Rejoignez la rédaction de www.developpez.com
    Par Community Management dans le forum Evolutions du club
    Réponses: 22
    Dernier message: 28/12/2015, 11h06
  2. Tutoriels, F.A.Q : la rubrique Assembleur de Developpez.com
    Par Alcatîz dans le forum Assembleur
    Réponses: 3
    Dernier message: 07/06/2007, 19h14
  3. Documentation gratuite sur l'API Windows, COM, DCOM, OLE, etc.
    Par Community Management dans le forum Windows
    Réponses: 1
    Dernier message: 16/11/2006, 15h28
  4. port com
    Par jeremi dans le forum C
    Réponses: 12
    Dernier message: 16/09/2002, 11h37

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