Page 1 sur 2
[Résolu] CopyMemoryString() et FreeMemory()
Publié : jeu. 02/déc./2010 0:40
par boddhi
Salut à tous !
Quelqu'un saurait-il m'expliquer pourquoi, dans ce code :
Code : Tout sélectionner
Procedure.i Fc_DeplacementFichierVersCorbeille(ArgFichier.s)
Define Fichier.SHFILEOPSTRUCT
If FileSize(ArgFichier)>0
*Tampon=AllocateMemory(Len(ArgFichier)+2)
If *Tampon
Fichier\hwnd=0
Fichier\pTo=0
Fichier\wFunc=#FO_DELETE
Fichier\pFrom=@ArgFichier
Fichier\fFlags=#FOF_ALLOWUNDO|#FOF_NOCONFIRMATION
CopyMemoryString(ArgFichier,@*Tampon)
CopyMemoryString(Chr(0))
CopyMemoryString(Chr(0))
Req=SHFileOperation_(@Fichier)
FreeMemory(*Tampon); => Erreur : "L'argument 'MemoryID' spécifié n'est pas valide"
EndIf
EndIf
ProcedureReturn Req
EndProcedure
NomFichier.s="C:\Temp.tmp"
If CreateFile(0,NomFichier)
For Compteur=1 To 100
WriteStringN(0,"Ligne "+Str(Compteur))
Next
CloseFile(0)
Debug Fc_DeplacementFichierVersCorbeille(NomFichier)
EndIf
la ligne
retourne l'erreur
"L'argument 'MemoryID' spécifié n'est pas valide" ?
Merci
Re: CopyMemoryString() et FreeMemory()
Publié : jeu. 02/déc./2010 10:06
par kernadec
bonjour Boddhi
essaye ça!
Cordialement
Re: CopyMemoryString() et FreeMemory()
Publié : jeu. 02/déc./2010 11:41
par case
dans l'exemple de la doc
*Tampon = AllocateMemory(1000)
*Pointeur = *Tampon
CopyMemoryString("Salut", @*Pointeur)
CopyMemoryString(" le Monde") ; Cette chaîne sera copiée juste après "Salut"
*Pointeur-2 ; revient en arrière de 2 caractères (sur le 'd' de 'Monde')
CopyMemoryString("DE") ; les deux dernières lettres seront en majuscules
Debug PeekS(*Tampon)
fred sépare bien le pointeur pour le copystring de celui pour l'allocate memory.
la valeur du pointeur change avec copymemorystring et se place a la fin de la chaine copiée
ce code fonctionne parfaitement
Code : Tout sélectionner
Procedure.i Fc_DeplacementFichierVersCorbeille(ArgFichier.s)
Define Fichier.SHFILEOPSTRUCT
If FileSize(ArgFichier)>0
*Tampon=AllocateMemory(Len(ArgFichier))
*mem=*tampon
If MemorySize(*Tampon)>0
Fichier\hwnd=0
Fichier\pTo=0
Fichier\wFunc=#FO_DELETE
Fichier\pFrom=@ArgFichier
Fichier\fFlags=#FOF_ALLOWUNDO|#FOF_NOCONFIRMATION
CopyMemoryString(ArgFichier,@*mem)
CopyMemoryString(Chr(0))
CopyMemoryString(Chr(0))
Req=SHFileOperation_(@Fichier)
FreeMemory(*Tampon); => Erreur : "L'argument 'MemoryID' spécifié n'est pas valide"
EndIf
EndIf
ProcedureReturn Req
EndProcedure
NomFichier.s="C:\Temp.tmp"
If CreateFile(0,NomFichier)
For Compteur=1 To 100
WriteStringN(0,"Ligne "+Str(Compteur))
Next
CloseFile(0)
Debug Fc_DeplacementFichierVersCorbeille(NomFichier)
EndIf
si tu ne tiens pas a séparer l'allocation du pointeur tu peux aussi faire un freememory(*tampon-len(ArgFichier)) par exemple...
Re: CopyMemoryString() et FreeMemory()
Publié : jeu. 02/déc./2010 11:46
par boddhi
J'y avais bien pensé mais marche pas non plus

. Même résultat !!!
La doc dit :
Resultat = CopyMemoryString(*Adresse [, @*MemoireDestinationID]) confirmé par l'exemple :
Code : Tout sélectionner
*Tampon = AllocateMemory(1000)
*Pointeur = *Tampon
CopyMemoryString("Salut", @*Pointeur)
CopyMemoryString(" le Monde") ; Cette chaîne sera copiée juste après "Salut"
*Pointeur-2 ; revient en arrière de 2 caractères (sur le 'd' de 'Monde')
CopyMemoryString("DE") ; les deux dernières lettres seront en majuscules
Debug PeekS(*Tampon)
Je ne comprends donc toujours pas pourquoi, dans cette situation précise, si j'alloue un bloc mémoire '*Tampon', je ne peux pas le libérer...
En reprenant l'exemple de la doc avec
*Pointeur = *Tampon, FreeMemory(*Pointeur) fonctionne...
Il y a là une subtilité qui m'échappe...
Re: CopyMemoryString() et FreeMemory()
Publié : jeu. 02/déc./2010 11:47
par boddhi
@Case
Nos posts se sont croisés

Je vais potasser à tête reposée ton explication...
Merci.
Re: CopyMemoryString() et FreeMemory()
Publié : jeu. 02/déc./2010 11:50
par case
j'ai édité mon post
la subtilité est que le pointeur se place a la fin de la chaine copiée ce qui te permet d'ajouter des caractères a la suite sans recalculer la position en mémoire
en fait si tu fait copymemorystring("123",@*tampon)
c'est comme faire *tampon=*tampon+3
si ensuite tu fait copymemorystring("456",@*tampon)
ca refais *tampon=*tampon+3
donc pour freememory(*tampon) tu dois faire freememory(*tampon-6)
c'est pour cela que le *mem=*tampon ca evite de tenir trace du nombre de caracteres copiés car la valeur *mem ne bouge pas, elle

Re: CopyMemoryString() et FreeMemory()
Publié : jeu. 02/déc./2010 12:00
par boddhi
@Case
Ah bah, dis comme ça, j'ai tout compris !!!
Merci sincèrement pour cette explication claire et concise !
Re: [Résolu] CopyMemoryString() et FreeMemory()
Publié : jeu. 02/déc./2010 12:11
par kernadec
bonjour Case
merci pour l'info
boddhi dit que son code ci-dessous ne fonctionne pas!
hors quand je teste les deux codes cela donne le même résultat 0 dans le debug
et un fichier "temp.tmp" dans la corbeille. sous winXP.
quel est le résultat attendu dans ce cas?
Cordialement
Code : Tout sélectionner
Procedure.i Fc_DeplacementFichierVersCorbeille(ArgFichier.s)
Define Fichier.SHFILEOPSTRUCT
If FileSize(ArgFichier)>0
*Tampon=AllocateMemory(Len(ArgFichier)+2)
If *Tampon
Fichier\hwnd=0
Fichier\pTo=0
Fichier\wFunc=#FO_DELETE
Fichier\pFrom=@ArgFichier
Fichier\fFlags=#FOF_ALLOWUNDO|#FOF_NOCONFIRMATION
CopyMemoryString(@Fichier,@*Tampon)
CopyMemoryString(Chr(0))
CopyMemoryString(Chr(0))
Req=SHFileOperation_(@Fichier)
FreeMemory(*Tampon); => Erreur : "L'argument 'MemoryID' spécifié n'est pas valide"
EndIf
EndIf
ProcedureReturn Req
EndProcedure
NomFichier.s="C:\Temp.tmp"
If CreateFile(0,NomFichier)
For Compteur=1 To 100
WriteStringN(0,"Ligne "+Str(Compteur))
Next
CloseFile(0)
Debug Fc_DeplacementFichierVersCorbeille(NomFichier)
EndIf
Re: [Résolu] CopyMemoryString() et FreeMemory()
Publié : jeu. 02/déc./2010 12:20
par boddhi
@Kernadec
Je n'ai jamais dit que le code ne fonctionnait pas... seulement que le FreeMemory retournait une erreur !
Ce n'est pas tout à fait pareil
L'api
SHFileOperation_(@Fichier) déplace le fichier vers la corbeille
avant que l'erreur FreeMemory ne survienne...
kernadec a écrit :hors quand je teste les deux code cela donne le même resultat 0 dans le debug
et un fichier "temp.tmp" dans la corbeille. sous winXP.
quel est le résultat attendu dans ce cas?
MSDN a écrit :Return Values:
Returns zero if successfull or nonzero if a error occurs.
Donc ton résultat ('0') est normal puisque le fichier créé a bien été déplacé vers la corbeille

Re: [Résolu] CopyMemoryString() et FreeMemory()
Publié : jeu. 02/déc./2010 12:31
par kernadec
comprend plus rien?
le code que je viens de poster ne retourne pas d'erreur
en prenant le nom "Fichier" de "Fichier\pFrom=@ArgFichier" cela ne fait il pas la même chose
que le code et l'explication de Case?
Cordialement
Re: [Résolu] CopyMemoryString() et FreeMemory()
Publié : jeu. 02/déc./2010 12:41
par case
en réalité je me demande a quoi sert toute la partie avec le *tampon qui en fait n'est pas utilisé réellement
Code : Tout sélectionner
Procedure.i Fc_DeplacementFichierVersCorbeille(ArgFichier.s)
Define Fichier.SHFILEOPSTRUCT
If FileSize(ArgFichier)>0
Fichier\hwnd=0
Fichier\pTo=0
Fichier\wFunc=#FO_DELETE
Fichier\pFrom=@ArgFichier
Fichier\fFlags=#FOF_ALLOWUNDO|#FOF_NOCONFIRMATION
Req=SHFileOperation_(@Fichier)
EndIf
ProcedureReturn Req
EndProcedure
NomFichier.s="C:\Temp.tmp"
If CreateFile(0,NomFichier)
For Compteur=1 To 100
WriteStringN(0,"Ligne "+Str(Compteur))
Next
CloseFile(0)
Debug Fc_DeplacementFichierVersCorbeille(NomFichier)
EndIf
car ceci fonctionne très bien

Re: [Résolu] CopyMemoryString() et FreeMemory()
Publié : jeu. 02/déc./2010 12:58
par kernadec
Merci Case
Cordialement
Re: [Résolu] CopyMemoryString() et FreeMemory()
Publié : jeu. 02/déc./2010 13:16
par boddhi
@case
C'était un vieux code que j'ai ressorti du placard (si tu avais pu sentir l'odeur

)... Et que j'ai repris vraiment tel quel
Sous PB 3.xx, si je me souviens bien...
Peut-être qu'à l'époque il fallait en passer par là pour que cela fonctionne...
Re: [Résolu] CopyMemoryString() et FreeMemory()
Publié : jeu. 02/déc./2010 13:38
par case
peut être mais la le truc c'est que tu n'utilise même pas le tampon crée ,) lol
ceci dit ca a le mérite d'avoir clarifié les choses sur la fonction copymemorystring()
Re: [Résolu] CopyMemoryString() et FreeMemory()
Publié : jeu. 02/déc./2010 23:48
par boddhi
Y a encore un truc qui m'échappe !!!
Les codes ci-dessus fonctionnent parfaitement tels quels...
Mais dès lors que j'en insère un dans mon programme, sans apporter la moindre modif à la procédure, j'ai le message suivant :
Si je clique sur Ignorer, ca fonctionne quand même (le fichier est bien déplacé vers la corbeille),
mais normalement l'option #FOF_NOCONFIRMATION est censée ne pas faire apparaître de boîte de dialogue...
C'est à y perdre mon latin...
