Dans l’implémentation ICollectionOnSTLImpl, impossible d’accéder aux membres de m_T ou de l’object item

J’essaie d’implémenter une collection d’objects via VC6 accessible par un programme VB6. Je n’ai pas réussi à le faire venir ensemble.

J’ai défini _CopyVariantFromAdaptItf et _CopyItfFromAdaptItf (à partir de “internes ATL”). Voici mes définitions à utiliser dans mes définitions de collections:

#define CComEnumVariantOnListOfItemInterface(ItemInterface) \ CComEnumOnSTL<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT,_CopyVariantFromAdaptItf,vector< CAdapt< CComPtr > > > #define ClassInterfaceCollImpl(ContainerInterface,ItemInterface) \ ICollectionOnSTLImpl< IDispatchImpl,\ vector< CAdapt< CComPtr > >,ItemInterface*,_CopyItfFromAdaptItf,\ CComEnumVariantOnListOfItemInterface(ItemInterface) > #define ContainerInterface IFields #define ContainerClass CFields #define ContainerClsid CLSID_Fields #define ItemInterface IField #define DllRegID IDR_FIELDS typedef std::vector< CAdapt< CComPtr > > ContainerType; 

et ceci le préambule de la classe conteneur:

 class ATL_NO_VTABLE ContainerClass : public ClassInterfaceCollImpl(ContainerInterface,ItemInterface), public ISupportErrorInfo, public CComObjectRoot, public CComCoClass { public: ContainerClass(); BEGIN_COM_MAP(ContainerClass) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(ContainerInterface) COM_INTERFACE_ENTRY(ISupportErrorInfo) END_COM_MAP() //DECLARE_NOT_AGGREGATABLE(CFields) // Remove the comment from the line above if you don't want your object to // support aggregation. DECLARE_REGISTRY_RESOURCEID(DllRegID) // ISupportsErrorInfo STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid); // IFields private: int GetIndex( BSTR name ); 

etc….

et dans ma tentative d’implémentation, j’essaie d’parsingr les objects inclus pour un nom correspondant auquel accéder dans la fonction pName () de l’object. Notez que je montre deux approches différentes que j’ai essayées:

 int CFields::GetIndex( BSTR name ) { long count = 0; #if (1) Count(&count); for (unsigned int i=0; ipName()) return (i); #else std::vector<CAdapt<CComPtr > >::iterator itr; for (itr = m_coll.begin(); itr != m_coll.end(); itr++) if (wcscmp( name, itr->m_T->pName())) count++; else return (count); #endif throw E_INVALIDARG_13; } 

Si j’essaie le #if (1), j’obtiens une erreur indiquant que m_T n’est pas membre du “vecteur m_T, j’obtiens une erreur indiquant que le “vecteur , ce à quoi je m’attendrais. Si j’essaie #if (0), j’obtiens une erreur indiquant que pName () n’est pas membre de ‘_NoAddRefReleaseOnCComPtr

Merci d’avance pour toute aide que vous pouvez me donner!

Vance

Je sais que je parle tout seul, mais j’espère pouvoir aider quelqu’un d’autre au cas où je tomberais sur une réponse CORRECTE.

Ok, j’ai un système qui fonctionne et basé sur la réponse à une autre question Comment extraire un pointeur d’object de la collection d’objects ATL? , c’est ce que j’ai fini avec. J’ai ajouté la ligne:

 COM_INTERFACE_ENTRY_IID(CLSID_Fields, CFields) 

entre les lignes BEGIN_COM_MAP (CFields) et END_COM_MAP () afin que getItemObjectPtr puisse fonctionner.

J’ai redéfini ItemInterface sur IField et modifié la méthode GetIndex en:

  long count = 0; ContainerType::iterator itr; for (itr = m_coll.begin(); itr != m_coll.end(); itr++) if (wcscmp( name, getItemObjectPtr( itr->m_T )->pName()) == 0) count++; else return (count); throw (HRESULT)E_INVALIDARG_13; 

et la méthode getItemObjectPtr est définie comme suit:

 CFields * CrecordSet::getItemObjectPtr( IFields *ppFields ) { CComQIPtr pFields = ppFields; return (pFields); }