Accueil > Forum > > > > Envoi d'un tableau de strings à une DLL standard
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 = 0X = 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
|
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
|
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
|
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
|
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
|
|
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
Livres en rapport
|
Derniers Blogs
[WP7] DYNAMICALLY CHANGE STARTUP PAGE[WP7] DYNAMICALLY CHANGE STARTUP PAGE par KooKiz
Let's say that you want to allow the user to customize the startup page of your application. You can easily change the startup page by editing the 'NavigationPage' attribute in the manifest file. But the manifest cannot be modified once the applicatio...
Cliquez pour lire la suite de l'article par KooKiz SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet
Logiciels
Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning
|