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 :

tableau DLL et VBA


Sujet :

C++

  1. #1
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut tableau DLL et VBA
    Bonjour
    est il possible de retourner via une fonction codée dans DLL en C++ un tableau dans un programme VBA?
    Je veux faire par exemple:

    Dim f(1 to 10)

    f=Funct(arg1,arg2,arg3...)


    ou Funct est une fonction codée dans une DLL en C++?
    Sans utiliser les SAFEARRAY.
    En fait, Funct devra tout simplement renvoyer un pointeur.

    J'ai fait un programme, en VBA,
    dans lequel j'ai déclaré la fonction Function de ce style:

    Declare Function Func Lib "C: \Users\....." Alias "_XL@16" (by val arg1, byval ar2...) as long

    mais ca me renvoie comme erreur:
    "Impossible d'affecte à un tableau. "

    On dirait qu'on peut pas transmetrtre de tableau de C++ en VBA, alors que l'inverse est possible.

    Merci
    Pierre

  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 518
    Points
    41 518
    Par défaut
    Pour transmettre un tableau C++ à VBA, il faudrait que VBA sache le gérer.
    Or, VBA ne sait gérer que les SAFEARRAY, donc avec ton critère de ne pas les utiliser, ça se mord la queue...
    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
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    ok ,

    regarde le message:
    void __stdcall trierTableau(int *base, unsigned *num);
    Voila ce que tu dois prendre dans ta dll et NENNI SAFEARRAY ou autre lenteur.
    Du cote VB:
    Declare Sub Lib trierTableau "SpeedVb.dll" (pArray As Long, nElem As Long)
    et tu l'appelles ainsi
    trierTableau lArray(0), 501
    en passant l'adresse de l'elem 0 a la dll.
    j'ai l'impression qu'il passe dans la fonction trierTableau le premier element du tableau lArray(0)
    ensuite, tous les autres seront accessible sur vba en faisant
    lArray(1),...

  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 518
    Points
    41 518
    Par défaut
    Mais là, tu passes le tableau à la fonction C ou C++, pas l'inverse.

    Mais bien sûr, le tableau est modifiable. Seule sa longueur est fixe.

    De plus, je déclarerais plutôt ça comme suit:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    void __stdcall trierTableau(int *base, unsigned num);
    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    Declare Sub Lib trierTableau "SpeedVb.dll" (ByRef pArray As Long, ByVal nElem As Long)

    Quand on est habitué au C ou C++ et qu'on code en VB, toujours préciser si chaque paramètre est ByRef ou ByVal: Ça documente le code.
    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
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Avec int * base on devrait plutôt déclarer dans VB : ByVal pArray As Long. On place dans pArray l'adresse du premier élément du tableau (c'est-à-dire VarPtr(t(1)) si l'indice du tableau commence par 1 ...). Je précise également que le int du C se déclare Long et non Integer (short) sous VB (mais je peux me tromper ^^).

    EDIT : Je n'ai pas lu le post plus haut. Si on passe simplement t(1) et non VarPtr(t(1)), alors on utilise ByRef et non ByVal en effet. D'ailleurs c'est plus simple avec ByRef (mais un peu trop haut niveau pour moi ).

  6. #6
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    est-ce que les Safearray demandent de charger des librairies spéciales dans VBA et lesquels?

    Est-ce que ca demande de faire des DLL Spéciales? Genre des DLL COM?

  7. #7
    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 518
    Points
    41 518
    Par défaut
    Pour les safearray, je ne sais pas exactement, mais pour les strings, je sais que VB suppose que toutes les chaînes sont "ANSI" pour des fonctions "normales": Il faut faire un objet COM pour avoir droit à des vraies BSTR.

    Si tu n'as pas d'histoire de chaînes, tu peux peut-être essayer en utilisant simplement un safearray dans ta DLL, sans changer grand-chose d'autre...
    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.

Discussions similaires

  1. SAFEARRAY tableau de strings, DLL et VBA
    Par beafrancky dans le forum Débuter
    Réponses: 4
    Dernier message: 20/07/2009, 08h42
  2. Dev-c++ Class -> Dll -> Object Vba Excel
    Par fx_forum dans le forum Dev-C++
    Réponses: 6
    Dernier message: 06/10/2006, 20h34
  3. [VBA-E] Problème de tableau dans macro VBA
    Par Chouls dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 12/06/2006, 16h20
  4. appel de dll depuis VBA
    Par darkman10 dans le forum Windows
    Réponses: 3
    Dernier message: 10/05/2006, 16h03
  5. [VBA-E]créer un tableau Excel en vba
    Par DonKnacki dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 19/01/2006, 17h06

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