Comment récupérer une chaine à partir de son pointeur ?

TitofControleur Messages postés 2 Date d'inscription mardi 19 août 2003 Statut Membre Dernière intervention 21 novembre 2004 - 21 nov. 2004 à 19:03
TitofControleur Messages postés 2 Date d'inscription mardi 19 août 2003 Statut Membre Dernière intervention 21 novembre 2004 - 21 nov. 2004 à 22:15
Salut !

Voilà, je commence à écrire des fonctions en C dans une dll que j'utilise en VB6. Problème, ma fonction en C doit renvoyer une chaine de caractère. (char*) Et ça fait tout planter !
Alors je renvoie juste l'adresse de la dite chaine de caractère, que je récupère en VB6, mais que je ne sais pas comment utiliser pour afficher ma chaine.
Quelqu'un aurait une idée pour définir l'adresse d'une variable String, par exemple, ou autre chose ?

Flagada

4 réponses

cs_frop01 Messages postés 1352 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 19 novembre 2008 2
21 nov. 2004 à 19:16
Salut ,

VB ne permet pas de déclarer un pointeur sur une variable. Donc si nous avons besoin des champs de la structure renvoyée, ou de la chaîne de caractères, nous devons recopier la zone mémoire qui est pointée, dans une variable. Afin d'y parvenir, nous pouvons utiliser ces deux fonctions de l'api windows :


Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As Any, _
    ByVal lpString2 As Any) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, _
    Source As Any, ByVal Length As Long)  



lstrcpy (lpString1, lpString2) recopie la chaîne qui est à l'adresse lpString2 dans la chaîne lpString1.

CopyMemory() recopie une zone mémoire dans une autre. Les paramètres sont :

l'adresse de la zone mémoire de destination
l'adresse de la zone mémoire à recopier
le nombre d'octets à recopier

Voyons comment récupérer une chaîne de caractères qui se trouve à une adresse donnée, à l'aide de lstrcpy() :


Private Function CopieChaine(ByVal adresse As Long) As String

Dim ret As String

If adresse > 0 Then
    ret = Space(256)
    lstrcpy ret, adresse
    ret = Trim(ret)
    If ret <> "" Then CopieChaine = left(ret, Len(ret) - 1)
End If

End Function 



@+

:-p [mailto:cyberscorp2004@msn.com MSN] :big) [mailto:frop01@yahoo.fr YAHOO] >:)

Membre du club CodeS-SourceS
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
21 nov. 2004 à 20:27
Si ta dll est pour VB elle doit directement retourner du String VB.
Regarde SysAllocStringByteLen() dans MSDN.

ciao...
BruNews, MVP VC++
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
21 nov. 2004 à 20:29
frop1 a raison il faut utiliser byval, dans ta fonction de déclaration de la dll tu peux mettre directement:
Byval Destination As String
il est toujours préférable d'utiliser les types explicitement plutôt que Any, quand on les connait bien sur.
dans ta fonction d'appel le Byval n'est plus nécessaire puisqu'il est déjà inclus dans la déclaration.
Lorsque Vb rencontre Byval il renvoit un pointeur de la variable.
Le problème c'est que la chaîne de réception doit être suffisamment grande pour recevoir les données renvoyées par la Dll sinon plantage !

Daniel
0
TitofControleur Messages postés 2 Date d'inscription mardi 19 août 2003 Statut Membre Dernière intervention 21 novembre 2004
21 nov. 2004 à 22:15
Merci beaucoup à tous !

Flagada
0
Rejoignez-nous