[Résolu] CopyMemoryString() et FreeMemory()

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

[Résolu] CopyMemoryString() et FreeMemory()

Message 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

Code : Tout sélectionner

FreeMemory(*Tampon)
retourne l'erreur "L'argument 'MemoryID' spécifié n'est pas valide" ?

Merci
Dernière modification par boddhi le jeu. 02/déc./2010 12:01, modifié 1 fois.
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: CopyMemoryString() et FreeMemory()

Message par kernadec »

bonjour Boddhi
essaye ça!

Code : Tout sélectionner

	CopyMemoryString(@Fichier,@*Tampon)
Cordialement
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: CopyMemoryString() et FreeMemory()

Message 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...
ImageImage
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: CopyMemoryString() et FreeMemory()

Message par boddhi »

kernadec a écrit :

Code : Tout sélectionner

CopyMemoryString(@Fichier,@*Tampon)
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...
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: CopyMemoryString() et FreeMemory()

Message par boddhi »

@Case
Nos posts se sont croisés :)
Je vais potasser à tête reposée ton explication...

Merci.
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: CopyMemoryString() et FreeMemory()

Message 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

:)
ImageImage
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: CopyMemoryString() et FreeMemory()

Message par boddhi »

@Case
Ah bah, dis comme ça, j'ai tout compris !!! :lol: :lol:

Merci sincèrement pour cette explication claire et concise !
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: [Résolu] CopyMemoryString() et FreeMemory()

Message 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
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: [Résolu] CopyMemoryString() et FreeMemory()

Message 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 :wink:
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 :wink:
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: [Résolu] CopyMemoryString() et FreeMemory()

Message 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
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: [Résolu] CopyMemoryString() et FreeMemory()

Message 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 :)
ImageImage
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: [Résolu] CopyMemoryString() et FreeMemory()

Message par kernadec »

Merci Case

Cordialement
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: [Résolu] CopyMemoryString() et FreeMemory()

Message par boddhi »

@case
C'était un vieux code que j'ai ressorti du placard (si tu avais pu sentir l'odeur :lol:)... Et que j'ai repris vraiment tel quel :oops:
Sous PB 3.xx, si je me souviens bien...

Peut-être qu'à l'époque il fallait en passer par là pour que cela fonctionne...
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: [Résolu] CopyMemoryString() et FreeMemory()

Message 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()
ImageImage
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: [Résolu] CopyMemoryString() et FreeMemory()

Message par boddhi »

Y a encore un truc qui m'échappe !!! :cry:

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 :
Image

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... :|
Répondre