Le premier site francophone dédié au développement Pocket PC


ATL à la rescousse de Embedded Visual Basic (partie 2)
 
   


Partie 1
Partie 2

Objet Collection en ATL pour eVB

Un problème souvent rencontré dans eVB est l'impossibilité d'avoir recours à une collection afin de stocker une liste de valeurs ou d'objets. Ce manquement n'est cependant pas irrémédiable grâce au C++ et ATL.

On entend par Collection, tout objet permettant de stocker une série d'informations (entiers, chaînes, objets, ...). Pour l'obtenir, il suffit de créer un composant comme tout autre et de fournir, en plus de l'interface normale pour une collection (taille, nombre d'éléments, contenu, ...), un support pour l'instruction for...each. ATL fournit pour cela une implémentation de l'interface d'énumération compatible avec les iterator de la STL. Bien sûr, la STL n'est pas fournie avec eVC, cependant une très brève recherche sur internet nous permet d'en trouver un adaptation (sur Google entrez le critère : STL "Windows CE"). Il est dès lors possible de créer un composant COM pour chaque type de Collection (list, vector, map, ...).

Première étape : créer le composant

Il faut bien attendu commencer par créer son composant (reportez vous à l'article " ATL à la rescousse de eVB "). Le composant doit bien évidemment contenir une instance d'un objet de ATL par exemple vector.

Il est possible de spécialiser son vecteur en précisant un type de donnée particulier :

typedef vector<short> IntCollection;

Ensuite une instance de IntCollection vous permettra de stocker des Integer et rien d'autre.

En général on préférera avoir une collection de Variant. Bien sûr, le traitement des variants est plus lent mais la souplesse offerte par ce type de données compense grandement ce désavantage.

typedef vector<VARIANT> Collection;

Les objets essentiels de la STL sont les suivants :
· vector : permet de créer un vecteur de taille dynamique
· map : permet de créer une liste d'objets indexée sur une clé (permet de créer l'objet Collection tel qu'il est connu dans Visual Basic)
· list : permet de créer une liste d'objets non indexée

La classe du composant héritera donc d'une de ces classes :

class ATL_NO_VTABLE CVBCollectionObj :
public CComObjectRootEx<CComSingleThreadModel>,
...
public std::vector<CComVariant>

Il est préférable d'utiliser CComVariant car l'objet initialise directement le variant à Empty.

Deuxième étape : support pour l'instruction for...each

La collection doit permettre l'utilisation du for...each de Visual Basic, pour cela notre composant doit posséder une propriété spéciale en lecture seule qui retourne un énumérateur. La propriété s'appelle _NewEnum, et doit posséder un dispid valant DISPID_NEWENUM.

Dans le fichier .idl on ajoute donc la déclaration de la propriété :

[propget, id(DISPID_NEWENUM), helpstring("property _NewEnum")]
HRESULT _NewEnum([out, retval] LPUNKNOWN *pVal);

_NewEnum retourne un pointeur sur une interface d'énumération, dans notre cas il s'agit de l'interface IEnumVARIANT. ATL fournit une implémentation des interfaces d'énumération compatible avec les itérateurs de la STL. L'implémentation de la fonction get__NewEnum n'offre donc aucune surprise.

typedef CComObject<CComEnum<IEnumVARIANT, &IID_IEnumVARIANT,
 VARIANT, _Copy<VARIANT> > > EnumVar;
STDMETHODIMP CVBCollectionObj::get__NewEnum(IUnknown** pVal)
 {
    HRESULT hr;
                 
    if (pVal == NULL) 
     return E_POINTER;
                 
    *pVal = NULL;
                 
    EnumVar* pEnumVar = new EnumVar;
    iterator itBegin = begin();
    iterator itEnd = end();
                 
    hr = pEnumVar->Init(itBegin, itEnd, NULL, AtlFlagCopy);
                 
    if SUCCEEDED(hr)
     hr = pEnumVar->QueryInterface(IID_IEnumVARIANT, (void**)pVal);
                 
    if FAILED(hr)
     delete pEnumVar;
                 
    return hr;
 }

Téléchargements

Sources eVC++

Sources du programme eVB de test

 


Laurent Bouffioux

 
       
   
 
   
Copyright 2001-2004 - Tous droits réservés
 
   

iPAQ est un produit de COMPAQ.
Visual Tools est un produit de Microsoft Corporation.
Toutes les autres marques et produits présents dans ces pages sont la propriété exclusive de leurs sociétés respectives.