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

 C Discussion :

SAFEARRAY tableau de strings, DLL et VBA


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut SAFEARRAY tableau de strings, DLL et VBA
    Salut le forum,

    Comme d'hab, je ne sais pas si mon post ci-dessous se fait au bon endroit du forum mais je tente le coup. Voici la situation :

    J'ai une fonction en C (vbaRecupListe) qui doit me fournir en sortie une liste de chaînes de caractères, et je veux récupérer cette liste dans Excel via du code VBA.

    Voici ma fonction C (vbaReupListe) destinée à la DLL, qui utilise un SAFEARRAY, sachant que la fonction originale 'RecupListe' appelée par 'vbaRecupListe' dans le code ci-dessous reçoit un argument de type 'char ***' à la base :

    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
    extern "C" __declspec(dllexport) Long __stdcall vbaRecupListe(SAFEARRAY **elements_liste)
    {
       long ind[1];
       unsigned long i;
       char **tmp_elements_liste=NULL;
       BSTR *chaine;
       HRESULT ret;
       Long retcode = RecupListe(&tmp_elements_liste);
       if(tmp_elements_liste)
       {
          if ((ret = SafeArrayAccessData(*elements_liste, (void **) &chaine))==S_OK)
          {
             for (i = 0; i < (*elements_liste)->rgsabound->cElements; i++)
             {
                ind[0] = 1;
                SafeArrayPutElement(*elements_liste, ind, tmp_elements_liste[i]);
             }
             SafeArrayUnaccessData(*elements_liste);
             //free(tmp_elements_liste);
          }
       }
       return retcode;
    }
    Cette fonction compile bien, mais je ne sais pas si elle fait ce que je voudrais (je ne peux pas la débugger, faute de temps...), à savoir remplir ma liste avec les instructions du SafeArray.

    Ensuite, en admettant que cela s'est bien passé, j'aimerais appeler la fonction depuis VBA dans Excel, et retourner les éléments de ma liste. Pour l'instant, j'ai fait ceci dans mon code VBA :

    J'ai déclaré ma fonction de récup de la liste ainsi :

    Public Declare Function RecupMaListe Lib "madll.dll" Alias "_RecupListe@8" (ByRef elements_liste() As String) As Long

    Puis j'appelle la fonction ainsi :
    dim retval as long
    retval = RecupMaListe(elements_liste())

    Ensuite, quand je veux afficher l'élément 0 de ma liste, j'ai un message vide dans VBA...

    Questions :

    1. Sachant que la fonction C originale 'RecupListe' appelée contient en argument un char ***, est-ce que l'argument 'SAFEARRAY **elements_liste' que j'ai déclaré dans 'vbaRecupListe' est OK ?

    2. Est-ce que le code permettant le remplissage de mon SafeArray est OK ?

    3. Est-ce que la déclaration de ma fonction en VBA avec un tableau de string est OK ? Sinon, quels arguments dois-je y passer ?

    4. S'il faut effectivement déclarer un tableau de string dans la fonction VBA, dois-je initialiser le tableau avant son remplissage, et si oui comment ?

    5. Comment puis-je appeler la fonction depuis VBA ? Dois-je passer en argument le premier élément de mon tableau de string, ou bien un pointeur vers le tableau (si pointeur, quel est le code ?) ?

    J'ai déjà écumé toute la littérature possible sur le Web sans pouvoir me dépatouiller de ce problème, donc je pense que si vous m'envoyez un lien vers des exemples, je risque d'être déjà tombé dessus...
    Alors si vous avez des suggestions concernant l'une de mes questions ci-dessus, ou des exemples de modification de ce code spécifiquement, je suis preneur et vous serez peut-être mon sauveur !

    Merci d'avance pour votre aide précieuse.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    1. Je dirais que oui.
    2. Je dirais qu'il manque le SafeArrayCreate(). Et peut-être aussi un SafeArrayDestroy() si le pointeur reçu en entrée est non-nul ? Ah, et aussi, tu ne sembles pas créer les BSTR à y mettre...
    3. On dirait, mais j'ai un doute sur la façon dont VB va interpréter les BSTR: Quand on appelle une fonction qui n'est pas dans un objet COM, VB a la facheuse habitude de s'adonner à la conversion ansi/unicode (il s'attend à ce que la fonction retourne une chaîne ansi) donc je ne sais pas comment il réagit aux tableaux.
    4. Oui, comme je l'ai dit, avec SafeArrayCreate() et SysAllocString()...
    5. Quand tu as un SAFEARRAY, il te suffit de passer le tableau VB avec le type tableau en ByRef.

    En gros, quand tu auras corrigé les problèmes à l'intérieur de la fonction même, il te restera le problème de voir si VB accepte les BSTR alors qu'il s'agit d'une fonction libre. S'il faut faire un objet COM pour que VB les accepte, ça va devenir compliqué...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Merci
    Bonjour Medinoc,

    Parfait, tu m'as donné quelques infos précieuses qui m'ont permis de réoudre mes problèmes et récupérer ma liste comme prévu.

    Pour ceux qui rencontrent le même genre de problème que moi, vous pouvez aller voir le lien ci-dessous, qui donne un exemple qu'on peut adapter en fonction des besoins, et cela fonctionne très bien :

    http://www.geocities.com/Jeff_Louie/safearray.html

    Encore merci, Medinoc, tu m'as sauvé la life !

    Petit message pour les modérateurs : J'ai bien reçu vos warnings, j'essaierai de m'y tenir, et encore désolé .

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Finalement, alors, ça marche avec un SAFEARRAY de BSTR unicodes, ou tu es obligé de passer par de l'Ansi pour que VB l'accepte?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Merci
    Salut Medinoc,

    Finalement, les SAFEARRAY de BSTR unicodes l'ont fait parfaitement !

    Encore merci de ton aide précieuse !

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

Discussions similaires

  1. Passer un tableau de string à un dll c++
    Par marcus7 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 08/11/2013, 13h53
  2. VBA / C++ - Passage de tableau de strings
    Par paparasta dans le forum C++
    Réponses: 1
    Dernier message: 26/11/2010, 15h26
  3. tableau DLL et VBA
    Par deubelte dans le forum C++
    Réponses: 6
    Dernier message: 26/01/2009, 13h57
  4. Réponses: 5
    Dernier message: 27/03/2008, 14h32

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