Transcrire copymemory en VB.net

Signaler
-
Messages postés
2426
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 mai 2021
-
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

Messages postés
2426
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 mai 2021
137
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
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...
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)
Messages postés
2426
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 mai 2021
137 > DamaBianca
Mets le code d'origine VB6 stp
>
Messages postés
2426
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 mai 2021

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
Messages postés
2426
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 mai 2021
137
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 !
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...
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
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 !
Messages postés
2426
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
1 mai 2021
137
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