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

VB 6 et antérieur Discussion :

Passage d'un tableau d'une DLL standard à VB6


Sujet :

VB 6 et antérieur

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 309
    Points : 58
    Points
    58
    Par défaut Passage d'un tableau d'une DLL standard à VB6
    Bonjour à tous

    Apres des heures de recherche de reflexion, beaucoup d'aide, je suis arrivé à faire un petit code qui permet de passer un tableau de string contenu dans une DLL standard (donc non activex) à un exe VB6

    Pour moi c'est un exploit

    Apparement ce code marche, mais j'aurais aimé avoir un avis d'expert sur ce dernier, afin de savoir si il est correct, ou meme mieux si il y a un chemin plus facile pour faire cela.
    Car si c'est bon, j'adapterais tous mes programmes sur ce modele

    Je vous remercie de votre avis

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    Private Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString1 As Any) As Long
    Private Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" (ByVal lpString As Any) As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, source As Any, ByVal size As Long)
    Private Declare Function TabloDansLaDll Lib "DllTablo.dll" () As Long
     
    Public Function StringDLL(AdresseVariable As Long) As String
     StringDLL = Space$(lstrlen(AdresseVariable))
     lstrcpy StringDLL, AdresseVariable
    End Function
     
    Public Function ArrayDLL(ByVal AdresseTabloDll As Long, ByRef LeTablo)
     
     Dim Tablo() As Long
     Dim AdrLongTablo As Long
     Dim LongTablo As Integer
     
     CopyMemory AdrLongTablo, ByVal AdresseTabloDll, 4
     LongTablo = Val(StringDLL(AdrLongTablo)) + 1
     ReDim Tablo(0 To LongTablo)
     CopyMemory Tablo(0), ByVal AdresseTabloDll, LongTablo * 4
     
     For i = 1 To UBound(Tablo())
      ReDim Preserve LeTablo(i)
      LeTablo(i) = StringDLL(Tablo(i))
     Next
     
    End Function
     
    Private Sub Form_Load()
     
     Dim LeTablo() As String
     ArrayDLL TabloDansLaDll, LeTablo
     
     For i = 1 To UBound(LeTablo())
      Debug.Print LeTablo(i)
     Next
     
    End Sub

  2. #2
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Bonjour,
    Apparemment, c'est toi qui développe la Dll.
    Si c'est bien le cas, j'aurai plutôt écrit une procédure utilisant le tableau comme paramètre
    afin que l'appel se fasse dans le style suivant :
    Declare sub ReadBuffer lib "myDll.dll" (buffer as Any)

    buffer est un tableau de byte
    chaque chaine est séparée par un ou deux caractères nul
    ce qui permet ensuite de récupérer le tableau en lui passant seulement la référence du premier élément
    Prévoir un fonction retournant la longueur du tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dim myBuffer() as Byte,lenArray as long
    lenArray=LenBuffer()  ' La fonction retournant la longueur du tableau
    redim myBuffer(0 to lenArray -1)  'Tableau Ascii
    ReadBuffer myBuffer(0)
    Il ne reste plus qu'à détailler les chaines contenues dans le tableau

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 309
    Points : 58
    Points
    58
    Par défaut
    Bonjour DARKVADER

    Tout d'abord merci de t'interesser à mon cas
    Ensuite j'aime bien ta citation qui parle des félés et de la lumiere
    Et aussi j'aime bien ton avatar, j'espere juste que le pauvre..... il sait lire le panneau danger pour sa santé sur les paquets de cigarette

    Bon pour en revenir, a mes moutons, parce que moi c'est des moutons, pas des chimpanzés que je gere

    Oui c'est moi qui fait la DLL.
    Je n'ai pas tout compris dans ta methode, mais en fait le tableau ne proviens pas de l'exe VB.....
    L'exe demande à la DLL de lire un fichier et de lui retourner ce dernier dans un tableau.
    Et pour l'instant je n'ai pas prévu qu'il le modifie, donc il ne fait que le lire, via la DLL

    Est ce que ta combine marche toujours dans ce cas ????

    Encore merci de ton aide

  4. #4
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Citation Envoyé par andrebernard Voir le message
    .../...
    Oui c'est moi qui fait la DLL.
    Je n'ai pas tout compris dans ta methode, mais en fait le tableau ne proviens pas de l'exe VB.....
    L'exe demande à la DLL de lire un fichier et de lui retourner ce dernier dans un tableau.
    Et pour l'instant je n'ai pas prévu qu'il le modifie, donc il ne fait que le lire, via la DLL
    .../...
    La solution que je te proposais était de récupérer un tableau de byte des données sérialisées
    mais le principe est le même pour un tableau de string
    coté dll tu retournes l'adresse du tableau
    coté vb tu récupères directement le tableau en passant en paramètre le premier élément par référence.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 309
    Points : 58
    Points
    58
    Par défaut
    D'accord impeccable.
    Comme je n'avais pas tout compris de ton idée, je voulais etre sur que tu ai bien compris que je ne passais pas le tableau de l'exe à la DLL

    Car on m'a proposé parfois une solution en passant le tableau et le faisant remplir par la DLL, et cette fonction ne me conviens pas.

    Bon je vais essayer d'appliquer ta methode, car je ne suis pas super doué, je doit le reconnaitre

    Je te tiens au courant, si tu le veux bien
    Encore merci

Discussions similaires

  1. Passage d'une struct contenant un tableau d'une DLL vers C#
    Par morgan_2956 dans le forum C++/CLI
    Réponses: 2
    Dernier message: 03/02/2010, 09h11
  2. [debutant]passage d'un tableau sur une autre page
    Par sissi25 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 05/02/2007, 09h43
  3. Réponses: 7
    Dernier message: 26/07/2006, 14h48
  4. Réponses: 2
    Dernier message: 21/12/2005, 17h33
  5. [VB6]Passage d'un tableau dans une DLL écrite en delphi
    Par flash dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 20/09/2002, 10h15

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