begin process at 2010 02 10 05:36:25
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Visual Basic 6

 > 

Divers

 > 

Débutants

 > 

Envoi d'un tableau de strings à une DLL standard


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Envoi d'un tableau de strings à une DLL standard

mercredi 3 juin 2009 à 09:49:54 | Envoi d'un tableau de strings à une DLL standard

andrebernard

Bonjour à tous

Voila j'aurais aimé avoir votre avis d'expert sur cete opération.
Je veux passer un tableau complet de strings à une DLL standard, que je réalise avec un language qui n'est ni VB ni C.

Cela fonctionne correctement, mais je suis obligé de passer par un tableau de pointeur dans lequel je depose chaque adresse de chaque string du tableau.

J'aimerais juste savoir si quelqu'un aurait une autre méthode.
Voici donc le code qui fonctionne :

Dim TabloString(3) as String
X = 0

X = X + 1: TabloString(X) = "Coucou"
X = X + 1: TabloString(X) = "Je suis un "
X = X + 1: TabloString(X) = "tableau de string"

Dim TabloPointeur() As Long
ReDim TabloPointeur(0 To X) As Long
TabloPointeur(0) = X
 
For i = 1 To X
 TabloPointeur(i) = StrPtr(TabloString(i))
Next
 
FonctionDll TabloPointeur(0)

Je vous remercie de votre aide
Bonne journée
mercredi 3 juin 2009 à 12:32:00 | Re : Envoi d'un tableau de strings à une DLL standard

PCPT

Administrateur CodeS-SourceS
salut,
tu devrais envoyer le pointeur du tableau, pas un tableau des pointeurs de chaque chaine


Declare Function VarPtrAny Lib "vb40032.dll" Alias "VarPtr" (lpObject As Any) As Long

FonctionDll byval VarPtrAny( TabloString (0) )

(après faut voir la dll en question )
++
mercredi 3 juin 2009 à 15:04:19 | Re : Envoi d'un tableau de strings à une DLL standard

andrebernard

Bonjour PCPT, je suis content de te reparler :-)

Je suis perdu entre les pointeurs, les tableaux de pointeurs, l'unicode etc....

Je suis donc, au prix de 2 litres de sueur, arrivé a faire ecrire ma fenetre....mais je suis sur que comme tu le dit, y'a surement autre chose que d'envoyer un tableau de pointeurs

Voici donc ou j'en suis

Private Declare Function FenetreTexte Lib "c:\mydll.dll" (ByVal Titre As String, ByRef TabloTexte As Long, Optional ByVal Couleur As Long, Optional ByVal Graphique As Integer) As Long
'Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Ptr() As Any) As Long
Private Declare Function VarPtrAny Lib "vb40032.dll" Alias "VarPtr" (lpObject As Any) As Long

' Ne marche pas
' *************

'Public Sub Form_Load()
'
' Dim TabloString(1 To 3) As String
' TabloString(1) = "Bonjour"
' TabloString(2) = "je suis un tableau VB"
' TabloString(3) = "et je veux sauter dans une DLL :-)"
' 'FenetreTexte "Coucou", VarPtrArray(Tablo), 0, 0
' FenetreTexte "Coucou", ByVal VarPtrAny(TabloString(1)), 0, 0
'
'End Sub

' Marche bien
' ***********

Public Sub Form_Load()

 Dim TabloString(1 To 3) As String
 TabloString(1) = "Bonjour"
 TabloString(2) = "je suis un tableau VB"
 TabloString(3) = "et je veux sauter dans une DLL :-)"
 AfficheTabloInfo "Coucou", TabloString, 0, 0

End Sub

Public Function AfficheTabloInfo(TitreFenetre As String, TabloVB() As String, Optional CouleurTablo As Integer, Optional Graphique As Integer)
 
 Dim TabloPointeur() As Long, MaxTablo As Integer
 MaxTablo = UBound(TabloVB)
 ReDim TabloPointeur(0 To MaxTablo) As Long
 TabloPointeur(0) = MaxTablo + 1
 
 For i = 1 To MaxTablo
  MyStr = StrConv(TabloVB(i), vbFromUnicode)
  TabloPointeur(i) = StrPtr(MyStr)
 Next
 
 FenetreTexte TitreFenetre, TabloPointeur(0), CouleurTablo, Graphique
  
End Function

Et voici la DLL qui n'a qu'une fonction

[ Lien ] [ Lien ]

Encore merci de ta precieuse aide

mercredi 3 juin 2009 à 15:05:31 | Re : Envoi d'un tableau de strings à une DLL standard

andrebernard

Pour la DLL, j'ai merdé, c'est le premier lien qui est le bon :-(
mercredi 3 juin 2009 à 16:18:29 | Re : Envoi d'un tableau de strings à une DLL standard

PCPT

Administrateur CodeS-SourceS
mais dans ta dll, le long correspond à quoi, le pointeur d'un safearray?

parce que :


VARPTRSTRINGARRAY

VarPtrStringArray gets the address of an array of Strings. To avoid the intrinsic
UNICODE/ANSI conversion performed by Visual Basic, the declaration has to be
defined in a type library.


Alternatively, you could use the MIDL compiler to compile your own type library
from the following .odl files.

For Visual Basic 6.0, create a text file named VB6ptrlib.odl with the content
below:

#define RTCALL _stdcall
[
uuid(C6799410-4431-11d2-A7F1-00A0C91110C3),
lcid (0), version(6.0), helpstring("VarPtrStringArray Support for VB6")
]
library PtrLib
{
importlib ("stdole2.tlb");
[dllname("msvbvm60.dll")]
module ArrayPtr
{
[entry("VarPtr")]
long RTCALL VarPtrStringArray([in] SAFEARRAY (BSTR) *Ptr);
}
}



sinon oui, un tableau de LONG serait attendu ^^

ps : quand on joue avec les pointeurs sur un tableau, on doit impérativement le déclarer commençant à 0

Prenez un instant pour répondre à ce sondage svp 
mercredi 3 juin 2009 à 16:55:12 | Re : Envoi d'un tableau de strings à une DLL standard

andrebernard

Non je ne crois pas, en fait j'y connais pas grand chose :-(
C'est une adresse memoire que la DLL attend, l'adresse de debut du tableau de pointeurs que VB a contruit

Apres je lis la memoire a partir de l'adresse que la DLL reoit.
Les 4 premiers octets, je les garde pour renseigner la longueur du tableau, l'enregistrement 0
Et apres je lis "longueur du tableau x 4" octets que je transfere a l'adresse d'un tableau qui est dans la DLL
Puis je fait une lecture avec l'instruction PEEK de chaque enregistrement du tableau de pointeur dans la DLL qui me transforme l'adresse en string
mercredi 3 juin 2009 à 21:35:03 | Re : Envoi d'un tableau de strings à une DLL standard

PCPT

Administrateur CodeS-SourceS
ok, je résume, tu as une vraie dll avec ou sans sa source et tu veux l'utiliser "comme tu veux" sans respecter ses attentes?

quelque chose m'échappe....
mercredi 3 juin 2009 à 22:53:44 | Re : Envoi d'un tableau de strings à une DLL standard

andrebernard

Non non, je me suis mal exprimé.
Voila la DLL c'est moi qui la fait, mais pas avec le C, ni avec VB car VB6 ne sait pas faire de DLL standard.
Normalement elle repond au meme standard que celles du C, elle utilise STDCALL comme appel.
Je n'y connais pas grand chose en DLL et rien en C malheureusement, pour moi ....le C c'est du domaine du reve, ça fait des années que j'achete les livres et les languages et que je n'y comprend pas grand chose :-(

Donc la DLL que je t'ai donné contiens une seule fonction, celle que j'appelle qui ouvre une fenetre et rempli une listbox du tableau de string que tu lui envoi.
Enfin pour etre plus precis....du tableau de pointeur que tu lui envoi.
Comme je te l'ai expliqué au dessus
C'est une adresse memoire que la DLL attend, l'adresse de debut du tableau de pointeurs que VB a contruit

Apres je lis la memoire a partir de l'adresse que la DLL reçoit.
Les 4 premiers octets, je les garde pour renseigner la longueur du tableau, l'enregistrement 0
Et apres je lis "longueur du tableau x 4" octets que je transfere a l'adresse d'un tableau qui est dans la DLL
Puis je fait une lecture avec l'instruction PEEK de chaque enregistrement du tableau de pointeur dans la DLL qui me transforme l'adresse en string

Mon probleme c'est que je peux compiler cette DLL en mode UNICODE ou bien ANSI.
Etand donné que le tableau VB que je lui envoi est apparement UNICODE par defaut et bien ma DLL qui est ANSI par defaut, ne le comprend pas, par contre elle inscrit bien le titre de la fenetre. TitreFenetre As String
Mais si je la compile en UNICODE alors cette fois c'est le titre string TitreFenetre As String qui ne passe pas et le tableau oui, c'est rageant

Moi ce que je voudrais c'est pouvoir envoyer a cette DLL le tableau de pointeur de mon tableau string mais en ANSI
J'ai essayé avec StrConv(TabloVB(i), vbFromUnicode) mais apparement ça ne marche pas et je ne sais pas pourquoi :-(
Est ce la bonne methode pour convertir en ANSI, car je prefererais convertir en ANSI dans VB que modifier ma DLL
Je sais c'est pas simple.....alors imagine pour moi :-(

En tout cas merci de t'interesser à mon cas perdu :-)
jeudi 4 juin 2009 à 01:39:38 | Re : Envoi d'un tableau de strings à une DLL standard

PCPT

Administrateur CodeS-SourceS
pourquoi et/ou comment as-tu codé, dans ta dll, une fonction devant recevoir un tableau LONG de pointeurs LONG (ce dans un langage apparemment top secret ^^)

étant l'auteur de la mystérieuse dll, ne peux-tu pas modifier le code pour (au plus simple) passer par le pointeur 0 du tableau ?

ps : pourquoi stoquer la taille en 0 ?... à partir du moment où le tableau n'est pas null, tous les langages savent récupérer la taille d'un tableau de type N

pss : normal que tu aies un problème ANSI avec un "chaine(ansi/ascii)" vers "unicode vers ascii"
tu converties une chaine non unicode
jeudi 4 juin 2009 à 08:22:43 | Re : Envoi d'un tableau de strings à une DLL standard

andrebernard

pss : normal que tu aies un problème ANSI avec un "chaine(ansi/ascii)" vers "unicode vers ascii"
tu converties une chaine non unicode

Bah j'y comprend plus rien.....j'avais lu sur les forum que VB gerait en UNICODE :-(
Et quand je compile ma DLL en unicode ça marche, alors bettement je me suis dit que ce devait etre de l'unicode que VB envoi

En fin de compte, mon idée est de passer a une DLL standard un tableau de string.
On m'a dit que le plus simple serait de creer un tableau de long contenant les adresses des pointeurs de mon tableau de string et de d'envoyer l'adrresse du tableau (0) contenant les pointeurs en faisant cette methode.

For i = 1 To MaxTablo
  TabloPointeur(i) = StrPtr(TabloVB(i))
 Next
 
 FenetreTexte TitreFenetre, TabloPointeur(0), CouleurTablo, Graphique

C'est donc ce que j'ai fait, j'etait satisfait mais j'ai vu que je n'avais que la premiere lettre de chaque phrase
On m'a conseillé de compiler ma DLL en UNICODE
C'est ce que j'ai fait, et la ça a marché :-)
J'etais donc content, mais je me suis apperçu que cette fois en UNICODE ma DLL lisait bien le tableau mais plus la variable "TitreFenetre"

Alors c'est pourquoi j'ai eu l'idée de demander à des experts en VB comme vous si il y avait une methode pour transmettre un tableau de string a une DLL.

Pour le language "Mystere" ;-) en fait si je n'en parle pas c'est parce que a chaque fois que j'ai demandé de l'aide a des professionnels comme toi du C et VB, soit je me suis fait envoyé dans les roses du style "Moi je suis programmeur avec un vrai language de programmation et pas bidouilleur" :-(
Ou au mieux, des que j'ai dit que ma DLL etait pas faite en C et que j'adorais ce language mais n'y connaissait rien et ben plus de reponse :-(

Tu ne le sais pas, mais je suis un ouvrier qui n'aimait pas l'ecole, mais qui s'est passionné a l'age de 16 ans pour la programmation.
Je suis fou d'elle.....mais comme dans toutes les grandes histoires tragiques d'amour, elle ne m'aime pas :-(
Alors je fais avec depuis plus de 25 ans, j'essai de programmer en VB et j'ai pu trouver un super language fait par un cerveau comme toi et certain des membres de ce forum, qui permet au burnes comme moi de toucher du doigt les joies de la programmation, sans etre trop expert.

Ce qui n'empeche pas les pro de l'utiliser car il est tres bien conçu, puissant, bas niveau, et compile en ASM assez propre, portable, multiplateforme, petit, produisant des exe autonomes et tout aussi petit, et en plus il permet de creer aussi bien des EXE que des DLL avec le meme code.
Alors je vais te dire le nom en esperant que tu ne prendras pas tes jambes a ton coup comme les autres :-(
Sache bien que ceux qui l'utilisent ou l'on créé n'en respecte pas moins le C ou autre,mais voit en lui un moyen rapide et propre de creer une petite appli qui tourne tres bien sans avoir a sortir l'artillerie lourde :-)

Mon reve depuis 25 ans serait de coder C........mais la seule chose que j'ai su faire c'est ouvrir la boite ....prendre peur......et la reposer sur mon etagere en la regardant desesperement tous les jours tout en poussant un Huuummmmmffff !!!! de tristesse.
Je pense que ce petit language par la taille mais grand par ses capacité a sa place au milieu des grands, car il n'a pas la pretention de remplacer les autres ....mais de traiter rapidement des petits problemes le plus simplement du monde.
Il est desormais reconnu, car il a une rubrique dans ww.developpez.com, c'est un gage du serieux de ce dernier, je pense.

Mon probleme a moi, c'est que j'essai de faire discuter VB et PB et ils sont tres different.
Sur le forum PB, il n'y a pas beaucoup de programmeur VB.....ils sont plutot ASM et C ou alors que PB et sur le forum VB pas beaucoup de monde veut m'aider ne me prenant pas au serieux ou bien pensant que PB n'est pas "un language" :-(

Bon je me lance........c'est PureBasic..........créé par Frederic laboureur un français qui se demene avec une petite equipe pour nous fournir le maximum de qualité avec le minimum d'argent.....et a notre epoque c'est pas commun non ?????

Tu es encore la ...... :-)))))

Bon si oui, je te donne le code de la DLL , j'ai oté la gestion de fenetre car je pense qu'elle ne doit pas t'interesser et alourdis la comprehension :-)

ProcedureDLL FenetreTexte(TitreFenetre.s, *AdresseTablo, Couleur = #Black, Graphique = #False)

  *AdresseTablo est un pointeur memoire (En PB quand il y a une etoile devant c'est un pointeur)
.s à la fin d'une variable signifie que c'est une string comme "TitreFenetre.s"
Couleur = #Black signifie que si on entre rien la valeur defaut sera la couleur #Black

 Dim MyArray.l(1)
 SizeOfArray.l = PeekL(*AdresseTablo) .l = long
 ReDim MyArray(SizeOfArray)
 CopyMemory(*AdresseTablo, @MyArray(), SizeOfArray * 4)
 Je copie la memoire de  SizeOfArray * 4 octets en partant de *AdresseTablo  dans le tablo @MyArray(), En PB @ signifie "adresse de"

....
<Code de la fenetre>   
...

J'ecris dans la listebox avec une boucle le tablo MyArray(i)
 For i = 1 To SizeOfArray
  AddGadgetItem(#ListviewTexte, - 1, MyArray(i))
 Next

...
<Code de la fenetre>   
...
 
EndProcedure

Voila je sais que ce que je te demande n'est pas simple :-(
Et je te remercie d'avoir la grandeur d'esprit de bien vouloir aider un handicapé de l'informatique comme moi



1 2 3 4 5 6

Cette discussion est classée dans : dll, tableau, strings, tablostring, tablopointeur


Répondre à ce message

Sujets en rapport avec ce message

Passer un tableau de string de VB vers une DLL C++ [ par paco ] Salut, mon problème est le suivant : je désire travailler avec des tableaux de string dans une de mes DLL C++. Ces tableaux, dynamiques, doivent venir DLL et tableau [ par globule ] comment appeler en VB une fonction d'une DLL en VC++ et recuper les valeurs dans un tableau (passage par reference) Problem d'utilisation d'une function d'une dll vb en vb.net [ par durka79 ] Bonjour à tous,Dans notre société, nous avons commencé de travailler en vb.net, il n'y a pas longtemps. Nous avons dans la suituation de reutiliser l passer un tableau de Bytes en paramètre d'une fonction dll [ par Taoufik77 ] Bonjour,j'ai une fonction dll (C++) qui prend en parametre un tableau de Bytes (CByteArray). Pour pouvoir l'appeler à partir d'une appli VB, j'ai défi Comment passer une structure contenant un tableau de VB à C ? [ par TomC ] Bonjour à tous.Je cherche à passer une structure de données, contenant un tableau de variant, de VB à C. Voici mon code :coté VB :---------Public Decl dll C++ dans vb, tableau en paramètre [ par Gueubaille ] Bonjour, je cherche à passer un tableau d'entiers (de caractère j'ai renoncé...) à partir de VB pour appeler une dll faite en C++, et je voudrai savoi Probleme avec un dll et un tableau de double [ par les french texans ] Bonjour, je vais essayer d'etre claire.J'ai un programme en VB6 (qui marche normalement) qui a un tableau de double :"Dim picture_array(0 To 310, 0 To DLL C++ (question pour expert) [ par alonsyl ] bonjour,j'ai cree une petite dll c++ afin de calculer la transposer d'une matrice.ma dll est compilee convenablement cependant je ne sais pas comment dll C++ dans vb, tableau 2D en paramètre [ par vba_blitz ] Bonjour,je souhaite faire passer un tableau 2D de double à partir de Vb pour appeler une dll c++. Je sais que pour les tableaux à une dimension il suf Mémoire ne peut pas etre READ (A l'aide !!) [ par andrebernard ] Bonjour à tousJ'ai déja créé un POST sur ce forum, j'ai eu quelques gentilles aides, mais personne n'a été en mesure de trouver la solution à mon prob


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,920 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales