Transcrire copymemory en VB.net

DamaBianca - 16 sept. 2015 à 14:09
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 - 17 sept. 2015 à 23:58
Bonjour,
je convertis du code VB6 en VB.net et je bute devant 2 appels :

Chaine as string
Valeur_R as double
CopyMemory(Chaine, Valeur_R, 8)

et
Valeur_ent as integer
Valeur_R as double
CopyMemory(Valeur_ent, Valeur_R, 4)

5 réponses

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
16 sept. 2015 à 16:12
Bonjour

Copymemory(Destination, source, longueur) copie une variable Source dans une variable Destination avec la longueur de la Destination

Pour le premier :
Chaine = Valeur_R.ToString

cela revient à créer le chaine de caractères Chaine qui contient Valeur_R : Si Valeur_R = 23,356 Chaine contiendra "23,546"

Pour le second :
Valeur_ent = Convert.toInt32(Valeur_R)

Cela revient à convertit la valeur double Valeur_R en valeur entière Valeur_ent . La valeur double ne doit pas contenir de décimale ( donc pas de virgule )

Sans plus de précision impossible de te répondre de façon formelle
0
Bonjour,
en fait c'est un peu plus compliqué que ça....
je transmets à du code C via une dll la valeur entière et la chaîne qui sont stockées dans une valeur double. Je veux récupérer en fait les 4 octets de la valeur entière et les 8 octets de la chaîne...
0
voici mon code :

'type entier
'CopyMemory(ValeurEnt, LesThemesIn.Valeur_R, 4)

Dim AffEnt as Integer
Dim Source() as Byte
Source = Encoding.Default.GetBytes(LesThemesIn.Valeur_R)

'Dim AddVal as IntPtr = Marshal.AllocHGlobal(4)
Dim MyGC as GCHandle = GCHandle.Alloc(AffEnt, GCHandleType.Pinned)

Dim AddVal as IntPtr = MyGC.AddrofPinnedobject

Marshal.Copy(Source, 0 , AddVal, 4)

'AffEnt = Cint(Marshal.ReadIntPtr(AddVal, 4))

AffEnt = Marshal.ReadInt32(AddVal, 4)

'on libère la mémoire
MyGC.Free()

'type chaine
'CopyMemory(chaine, LesThemesIn.Valeur_R, 8)

Dim Source() as Byte
Source = Encoding.Default.GetBytes(LesThemesIn.Valeur_R)

'obtenir l'@de la variable
Dim AddVal as IntPtr = Marshal.AllocGlobal(8)
Marshal.Copy(Source, 0, AddVal, 8)

'copie de la mémoire vers la chaîne
Marshal.Copy(AddVal, chaine, 0, 8)

'on libère la mémoire
Marshal.FreeHGlobal(AddVal)
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > DamaBianca
17 sept. 2015 à 09:58
Mets le code d'origine VB6 stp
0
DamaBianca > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
17 sept. 2015 à 10:46
Ok, voici le code VB6:

'dans la DLL qui sert de passerelle avec le C:
Public Type ParametreLectureTheme
Nom as String * 16
Type as Long
Commentaire as String * 40
valeur_R as Double
end Type

Public Type Theme
LesThemes(0 to NbrM%axTheme - 1) as ParametreLectureTheme
end Type

Public Declare Function LectureTheme Lib "dll_ihm.dll" Alias "lecture_theme" (parametres as Theme, Gestion as GestionMaintenance) as Long

'code VB6 associé
'lecture des varaiables
ret = LectureTheme(LesThemesIn, MesGestion)

dim Typlu as Long
dim Typaff as string
dim ValeurAff as Double
Dim ValeurEnt as Long
dim chaine as string * 8
chaine = space(8)
dim chainecom = Space(32)

for i = 1 to Nbchamps
Typlu = LesThemesIn.Lesthemes(i-1).Type
Select case Typlu
case 0 'type réel
Typaff = "Réel"
ValeurAff = LesThemesIn.Lesthemes(i-1).valeur_R

case 1 'type entier
Typaff = "Entier"
CopyMemory ValeurEnt, LesThemesIn.Lesthemes(i-1).valeur_R, 4

case 2 'type caractère
Typaff = "Caractère"
CopyMemory ByVal chaine, LesThemesIn.Lesthemes(i-1).valeur_R, 8

End select
next
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
17 sept. 2015 à 12:19
Ce code VB6 est truffée d'erreurs
1)
Public Type ParametreLectureTheme
Nom as String * 16
Type as Long
Commentaire as String * 40
valeur_R as Double
end Type

Type ne peut pas être une variable de la structure

2)
Public Type Theme
LesThemes(0 to NbrM%axTheme - 1) as ParametreLectureTheme
end Type

Ca n'a pas de sens : c'est quoi NbrM%axTheme ?????
De plus un type dimensionné par un tableau de type ????

3)
case 2 'type caractère
Typaff = "Caractère"
CopyMemory ByVal chaine, LesThemesIn.Lesthemes(i-1).valeur_R, 8

en 32 bits une chaine de caractères est définie par un pointeur sur 4 octets ( son adresse en mémoire) et une taille sur 4 octets ( la longueur de la chaine)
Si tu passes en 64 bits le pointeur doit être sur 8 octets car les pointeurs sont sur 64 bits !
VB 6 ne travaille qu'en 32 bits mais Windows peut travailler en 32 ou 64 bits ! L'exécutable en 64 bits ne fonctionnera pas !

bon courage !
0
non mais le code VB6 fonctionne parfaitement, je n'ai pas tout réécrit, c'était juste pour donner une idée....
Bref, c'est la transcription en VB.net qui m'intéresse...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 sept. 2015 à 13:19
Bonjour,
je n'ai pas tout réécrit, c'était juste pour donner une idée

Il se trouve que l' "idée ainsi exposée" est fort incomplète et ne permet nullement de s'y retrouver ...
Remarque : le code que tu montres ici n'est d'ailleurs même pas (c'est évident) un copier/coller RIGOUREUX du code écrit en VB6 !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
17 sept. 2015 à 23:58
C'est peut-être avec des idées que l'on pond du code mais il faut aussi de la rigueur et du sérieux
Bonjour à ucfoutu en passant
0
Rejoignez-nous