vb95
Messages postés3472Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention13 avril 2024169 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
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...
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)
vb95
Messages postés3472Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention13 avril 2024169
>
DamaBianca
17 sept. 2015 à 09:58
Mets le code d'origine VB6 stp
DamaBianca
>
vb95
Messages postés3472Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention13 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
vb95
Messages postés3472Date d'inscriptionsamedi 11 janvier 2014StatutContributeurDernière intervention13 avril 2024169 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 ????
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 !
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...
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018211 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 !
Vous n’avez pas trouvé la réponse que vous recherchez ?
17 sept. 2015 à 09:12
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...
17 sept. 2015 à 09:46
'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)
17 sept. 2015 à 09:58
17 sept. 2015 à 10:46
'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