OVH Cloud OVH Cloud

Gros probléme de Api et Ram

1 réponse
Avatar
Ivan Pequeño
A l'aide, au sécours

Voici le corps du délit
Tout devraie marcher a merveille or ce code Tue Visual basi une fois sur deux
Le Probl. se produit en HdAlloc = GlobalAlloc(GHND, RamLen)
GHND = &H2 Or &H40
ou dans l'appel a CopyMemory

Function Graba(ByVal RamStr) As Byte

Dim HdAlloc As Long, KePtr As Long, RamPtr As Long

Dim RamLen As Long

RamLen = Len(RamStr)
HdAlloc = GlobalAlloc(GHND, RamLen)
RamPtr = GlobalLock(HdAlloc)

KePtr = StrPtr(RamStr)
' Destino Desde Ptr de Que ? Cuanto
' Vers Dépuis Combien
CopyMemory ByVal RamPtr, ByVal KePtr, RamLen * 2

End Function

Je remecie d'avance tout aide

1 réponse

Avatar
Picalausa François
Hello,

Il me semble que tu ne désalloue pas la mémoire après l'avoir allouée
(GlobalFree & GlobalUnalloc), est-ce bien normal?
Puisque tu remplace toute la mémoire directement après allocation, as-tu
réellement besoin d'utiliser GMEM_ZEROINIT = &h40?
Sinon, tu alloue n bytes et tu en copie 2n, est-ce bien normal? (tu fais un
buffer overrun)
Astuce : utiliser LenB pour connaitre la longueur en octets d'une variable.
Il faut aussi t'assurer que le paramètre d'entrée est bien une chaine de
caractères et que celle ci est de longueur non nulle:

Option Explicit

Private Const GMEM_FIXED = &H0
Private Const GMEM_MOVEABLE = &H2
Private Const GMEM_ZEROINIT = &H40
Private Const GHND = GMEM_MOVEABLE Or GMEM_ZEROINIT

Private Declare Function GlobalAlloc _
Lib "kernel32" _
( _
ByVal uFlags As Long, _
ByVal dwBytes As Long _
) _
As Long
Private Declare Function GlobalLock _
Lib "kernel32" _
( _
ByVal hMem As Long _
) _
As Long
Private Declare Function GlobalUnlock _
Lib "kernel32" _
( _
ByVal hMem As Long _
) _
As Long
Private Declare Function GlobalFree _
Lib "kernel32" _
( _
ByVal hMem As Long _
) _
As Long
Private Declare Sub CopyMemory _
Lib "kernel32" _
Alias "RtlMoveMemory" _
( _
Destination As Any, _
Source As Any, _
ByVal Length As Long _
)

Private Sub Command1_Click()
Graba "Hello world"
End Sub

Function Graba(ByVal RamStr As String) As Byte
Dim HdAlloc As Long, RamPtr As Long
Dim RamLen As Long

RamLen = LenB(RamStr)

If RamLen = 0 Then
'Gestion d'erreur
Else
HdAlloc = GlobalAlloc(GMEM_MOVEABLE, RamLen) 'ou GHND
RamPtr = GlobalLock(HdAlloc)
CopyMemory ByVal RamPtr, ByVal StrPtr(RamStr), RamLen
GlobalUnlock RamPtr
GlobalFree HdAlloc
End If
End Function


Attention, les modifications que j'ai apportée désalouent effectivement la
mémoire...
Il est aussi une note intéressante dans le PSDK:
Note The global functions are slower than other memory management functions
and do not provide as many features. Therefore, new applications should use
the heap functions. However, the global functions are still used with DDE
and the clipboard functions.

--
Picalausa François

"Ivan Pequeño" <Ivan Pequeñ a écrit dans le
message de news:
A l'aide, au sécours

Voici le corps du délit
Tout devraie marcher a merveille or ce code Tue Visual basi une fois sur
deux
Le Probl. se produit en HdAlloc = GlobalAlloc(GHND, RamLen)
GHND = &H2 Or &H40
ou dans l'appel a CopyMemory

Function Graba(ByVal RamStr) As Byte

Dim HdAlloc As Long, KePtr As Long, RamPtr As Long

Dim RamLen As Long

RamLen = Len(RamStr)
HdAlloc = GlobalAlloc(GHND, RamLen)
RamPtr = GlobalLock(HdAlloc)

KePtr = StrPtr(RamStr)
' Destino Desde Ptr de Que ? Cuanto
' Vers Dépuis Combien
CopyMemory ByVal RamPtr, ByVal KePtr, RamLen * 2

End Function

Je remecie d'avance tout aide