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

MFC Discussion :

Passage de tableaux


Sujet :

MFC

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Passage de tableaux
    Bonjour,

    Je me prends la tete depuis 4 jours sur un problemes et j'espere que vous pourrez m'aider!

    Je suis en train de créer un objet automation en C++ (une DLL) qui sera appelé de VB. Je n'arrive pas a me passer un tableau d'objets entre VB et C++. Un object simple passe: je déclare mon parametre LPDISPATCH et je recupere mon objet sans probleme. Par contre pour ce qui est d'un tableau d'objet c'est une autre histoire....

    Merci de votre aide

    Jeff

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    quels type d'objets ?
    ça m'etonnerait que ça soit compatible.

  3. #3
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Salut

    Pourquoi ne pas transiter par des VARIANTS ou COleVariant?

    Gabrielly

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    J'ai crée une classe dérivée de l'interface IDispatch que j'instancie depuis VB.

    Pour passer cette classe en tant qu'objet simple, ma fonction C++ prenait comme argument un pointeur IDispatch et j'utilisait COLEDispatchDriver pour accéder a mon objet. Jusque la, aucun problemes.

    Maintenant je souhaite passer un tableau de cette classe. J'ai essayer de récupérer le tableau en tant que VARIANT du coté c++, mais bien que j'arrive a retrouver les dimensions du tableau je n'arrive pas a faire quelque chose du contenu...

  5. #5
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Montre nous ton code?

    Gabrielly

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    ok je vous montre deja ce que j ai reussi a faire:

    La DLL:

    La librairy s'appelle EmosLib
    J'ai une classe CEmosDatabase qui est l'object principal
    J'ai une classe CEmosSPParams qui est l'object que je vais instancier dans mon code VB et passer a une méthode de CEmosDatabase.

    la fonction AcceptSingleArguemnt accepte un objet et le traite en tant que CEmosSPParams:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void CEmosDatabase::AcceptSingleArgument(LPDISPATCH TestClass) 
    {
    	CString str1;
    	IEmosSPParams p1;
     
    	p1.AttachDispatch(TestClass);
     
    	str1 = p1.GetParamName();
     
    	p1.DetachDispatch();
    }
    le code idl associé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void AcceptSingleArgument(IDispatch* TestClass);
    Le code VB:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim db As New EmosLib.EmosDatabase
    Dim MyClass As New EmosLib.EmosSPParams
     
    MyClass.ParamName = "TestParamName"
     
    Call db.AcceptSingleArgument(MyClass)

    Voila pour ce qui marche... Maintenant je souhaite que ma fonction AcceptSingleArgument accepte non pas 1 objet CEmosSPParams mais un tableau de cet objet (suite au prochain post...)


  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    le code VB devient donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim MyClass(1 To 2) As New EmosLib.EmosSPParams
     
    MyClass(1).ParamName = "TestParamName1"
    MyClass(2).ParamName = "TestParamName2"
     
    Call db.AcceptMultipleArguments(MyClass)
    Et voila ce que j'ai essayé du coté de la DLL:

    code idl:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void AcceptMultipleArguments(VARIANT TestClass);
    la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void CEmosDatabase::AcceptMultipleArguments(const VARIANT FAR& TestClass) 
    {
    	if( TestClass.vt & VT_ARRAY )
    	{
    		long l_ubound, l_lbound;
     
    		SafeArrayGetUBound(TestClass.parray,1,&l_ubound);
    		SafeArrayGetLBound(TestClass.parray,1,&l_lbound);
     
     ...
    	}
    }

    C'est le plus loin que j'ai pu aller... les valeurs l_ubound et l_lbound sont bonnes mais je ne sais pas quoi faire avec le TestClass.parray pour récupérer mes objets... (du moins sans que ca plante )
    (bis )

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    je le saurais pour la prochaine fois

  9. #9
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 35
    Points : 38
    Points
    38
    Par défaut
    En il faut utiliser "SafeArrayAccessData" et "CCmdTarget::FromIDispatch" pour avoir accès aux élément

    ça donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    void CEmosDatabase::AcceptMultipleArguments(const VARIANT FAR& TestClass) 
    {
    	if( TestClass.vt & VT_ARRAY ) { 
          long l_ubound, l_lbound; 
     
          SafeArrayGetUBound(TestClass.parray,1,&l_ubound); 
          SafeArrayGetLBound(TestClass.parray,1,&l_lbound); 
     
    	  LPDISPATCH HUGEP *pDElts;
    	  CEmosSPParams * pDElt;
     
    	  SafeArrayAccessData((SAFEARRAY FAR*) TestClass.byref, (void HUGEP* FAR*)&pDElts);
     
    	  for(int i = l_ubound; i<=l_lbound;i++) {
     
    		  pDElt = (CEmosSPParams * )CCmdTarget::FromIDispatch(pDElts[i]);
    		  /* Utiliser pDElt */
    	  }
     
    	  SafeArrayUnaccessData((SAFEARRAY FAR*) TestClass.byref);
     
       } 
     
    }

  10. #10
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 35
    Points : 38
    Points
    38
    Par défaut
    Non plutôt!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    void CEmosDatabase::AcceptMultipleArguments(const VARIANT FAR& TestClass) 
    { 
       if( TestClass.vt & VT_ARRAY ) { 
          long l_ubound, l_lbound; 
     
          SafeArrayGetUBound(TestClass.parray,1,&l_ubound); 
          SafeArrayGetLBound(TestClass.parray,1,&l_lbound); 
     
         LPDISPATCH HUGEP *pDElts; 
         IEmosSPParams  P; 
     
         SafeArrayAccessData((SAFEARRAY FAR*) TestClass.byref, (void HUGEP* FAR*)&pDElts); 
     
         for(int i = l_ubound; i<=l_lbound;i++) { 
     
            P.AttachDispatch((pDElts[i]); 
            str1 = P.GetParamName(); 
            (...)
            P.DetachDispatch();  
         } 
     
         SafeArrayUnaccessData((SAFEARRAY FAR*) TestClass.byref); 
     
       } 
     
    }

Discussions similaires

  1. Passage de tableaux en paramètre d'une webmethod
    Par VonDutch4520 dans le forum Services Web
    Réponses: 1
    Dernier message: 01/09/2010, 16h59
  2. [PHP 5.0] Passage de tableaux d'objets dans la session
    Par sourivore dans le forum Langage
    Réponses: 4
    Dernier message: 30/05/2009, 23h41
  3. [script.aculo.us] Passage de tableaux à Ajax.Request
    Par Tavarez59 dans le forum Bibliothèques & Frameworks
    Réponses: 6
    Dernier message: 30/04/2009, 15h05
  4. passage de tableaux à deux dimensions
    Par afnane dans le forum C++
    Réponses: 6
    Dernier message: 25/06/2008, 16h46
  5. Réponses: 7
    Dernier message: 07/01/2007, 13h50

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