jockos
Messages postés321Date d'inscriptiondimanche 22 octobre 2000StatutMembreDernière intervention14 mai 2005
-
8 août 2003 à 11:44
cs_Fever
Messages postés1Date d'inscriptionjeudi 11 septembre 2003StatutMembreDernière intervention11 septembre 2003
-
11 sept. 2003 à 16:05
Bonjour,
Existe t-il une fontion VB toute faite qui permette de TRANSTYPER un tableau dynamique Binaire (Byte()) en une chaine de caractères (String).
En fait, j'ai une fonction C++ dans un ocx qui me retourne un tableau de BYTE dynamique.
Pour le manipuler, j'ai besoin de la transtyper dans une String...
Evidemment, Cstr() ne marche pas...
Si vous ne savez pas, tant pis, je me résoudrais à écrire une petite routine VB qui va "balayer" (parcourir) octet par octet (case par case) le tableau de Byte et qui va concaténer chaque caractère à une String.
Je vais donc construire une String à partir d'un tableau de Byte.
Mais vu la lenteur de VB, si j'ai un très gros tableau binaire, j'ai peur que ça rame un peu...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 8 août 2003 à 12:00
API: SysAllocStringByteLen(ptrData, lenData);
Vraiment utile de caster en String ? Si est tableau binaire, ne donnera pas grand chose a l'affichage.
BruNews, ciao...
jockos
Messages postés321Date d'inscriptiondimanche 22 octobre 2000StatutMembreDernière intervention14 mai 20052 8 août 2003 à 12:20
C'est justement pour cela que je caste en String, de manière à pouvoir afficher le contenu de mon flux mémoire.
Une fonction C++ ne peut pas retourner de STRING.
Elle peut retourner un BUFFER que l'on récupèrera dans une String, mais dans ce cas, la taille est limité !
On a donc recours à un tableau dynamique de Byte, pour passer d'une fonction C++ à VB sans avoir une taille limite.
De plus, ce transtypage peut être utilisé quand on met dabns une ressource VB un fichier texte (Ressource de type CUSTOM).
On appelle la fonction VB LoadResData pour récupérr le contenu du fichier texte présent dans la ressource, mais cette fonction retourne (comme apr hasard ;) un tableau dynamique de Byte.
J'ai fais ma petite routine de transtypage...
Est-ce que je peux l'optimiser plus, je ne crois pas...
Si vous avez des suggestions pour l'optimiser, merci...
'TRANSTYPAGE : Byte() -----> String (utilisé pour transtyper un tableau dynamique binaire dans une String)
---------------------------------------------------------------------
Public Function ByteToString(ByRef bInput() As Byte) As String
Dim i As Long
ByteToString = ""
i = 0
Do While i < UBound(bInput) + 1
ByteToString = ByteToString + Chr$(bInput(i))
i = i + 1
Loop
End Function
---------------------------------------------------------------------
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 8 août 2003 à 12:28
Une fonction C++ peut parfaitement retourner un type STRING de vb. Le C/C++ est sans limite et c'est la base de la virtual machine de vb. Faut-il que cette dll soit ecrite specifiquement pour vb, c'est ce que je fournis dans mes sources ici meme.
Ceci dit je comprends que la func ByteToString() soit d'une lenteur redibitoire si le tableau est tres grand. Il faudrait une dll qui te le fasse. Je peux t'en faire une vraie (ASM et non OCX) qui te fera le boulot et retourne un String.
BruNews, ciao...
jockos
Messages postés321Date d'inscriptiondimanche 22 octobre 2000StatutMembreDernière intervention14 mai 20052 8 août 2003 à 19:13
Alors là, tu m'étonnes et je doute que cela fonctionne.
Cela voudrait dire que l'opérateur d'affectation (le "égal") est surdéfinit pour faire un castage automatique entre un Tableau de Byte et une String et réciproquement. Or ce n'est pas le cas.
En C++, on pourrait faire cela en créant des classes héritant de String et de Byte et en SURDEFINISSANT l'opérateur d'affectation.
jockos
Messages postés321Date d'inscriptiondimanche 22 octobre 2000StatutMembreDernière intervention14 mai 20052 8 août 2003 à 19:18
Le C++ n'est pas sans limite quand on l'interface avec d'autre langage. Le VB ne sait pas gérer les pointeurs !
Si ta fonction C++ (contenu dans une dll ou ocx) retourne un Char *, tu ne pourras pas l'interpréter avec VB.
il faut tout de même admettre qu'il faut limiter le C++ afin de pouvoir utiliser les routines C avec VB. (Uniquement en ce qui concerne les paramètres de la routine C et la valeur retourné quand il s'agit d'une fonction).
Pour ce qui est du coeur de la routine C++, y a pas de problème, on peut faire ce que l'on veut indépendamment du langage utilisant cette routine compilé.
La limite se trouve dans l'interfaçage des 2 langages :
- paramètres de la routine
- valeur retourné
Même le modèle de programmation COM de Microsoft, en utilisant pourtant des interfaces ne répond pas à ce problème.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 8 août 2003 à 19:30
Je ne parlais que pour l'interieur de la dll, en C (ou ASM) fais ce qu'il te plait. Pour l'appelant, vb ici, on lui ressort ce qu'il attend et rien d'autre. S'il faut du vb String, il en a.
BruNews, ciao...
crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 200628 9 août 2003 à 00:44
Je te garantit que ce code me génère trois MessageBox affichant la même chose ("Azerty").
Essaye donc, tu devrais avoir le même résultat !
De plus, dans certain appel API, tu transmet des string via un tableau de byte, et ca se passe comme cela :
dim abString() as byte, sValue as string
abString = sValue & vbNullChar
lRet = AppelAPI(abString(0))
C'est par exemple le cas pour toutes les API concernant le réseau (énum de ressource, de serveur, d'utilisateur, etc ...)
EN fait, j'ai mis un fichier TEXTE (.txt) dans un fichier de ressource joint à mon appli (id = 101).
Je veux récupérer le contenu de ce fichier texte et l'afficher dans un RichTextBox.
La fonction LoadResData retourne un Tableau de Byte (Byte()).
Or , à l'affichage, j'obtiens que des ????????????????????????.
Il faut donc NECESSAIREMENT TRANSTYPER le tableau de Byte en String !
cs_Fever
Messages postés1Date d'inscriptionjeudi 11 septembre 2003StatutMembreDernière intervention11 septembre 2003 11 sept. 2003 à 16:05
Salut Jockos!!
Il est peut-être un peu tard mais bon... c l'intention qui compte.
Alors voilà, je ne suis pas sûr d'avoir bien compris ce que tu voulais faire, mais moi pour passer d'un tableau Byte() à une chaîne de caractères String, j'utilise la fonction StrConv :
Apparrement, VB fait la conversion de type dans le passage de paramètres puisque en fait cette fonction prend normalement une String en premier paramètre.
Ca a déjà marché pour certains de mes progs, alors tu peux toujours essayé...