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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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:
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
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
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:
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ño@discussions.microsoft.com> a écrit dans le
message de news: 8A18ED18-23D0-42A1-85CE-09730946EDC1@microsoft.com...
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
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:
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