Modifier les octets d'un objet

Résolu
Matware456 Messages postés 19 Date d'inscription jeudi 23 novembre 2006 Statut Membre Dernière intervention 27 août 2009 - 23 juin 2009 à 17:37
Matware456 Messages postés 19 Date d'inscription jeudi 23 novembre 2006 Statut Membre Dernière intervention 27 août 2009 - 27 août 2009 à 17:29
Salut, c'est encore moi ! ^^

Voilà maintenant que j'ai enfin réussi à stocker mon Bitmap dans un fichier mappé, je cherche maintenant à modifier les bytes de mon objet image pour pouvoir l'afficher, j'utilise ce code :

CopyMemory(@image,MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,(320*240*3)+56),(320*240*3)+56);
Mais il ne fonctionne pas... Pourtant je crois que tout est en règle mais j'obtiens une EAccessViolation. =/
Merci d'avance pour votre aide !

Matware456

12 réponses

Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
23 juin 2009 à 19:13
c'est quoi ton "image"? un TImage, un TBitmap, un buffer (genre issu de ScanLine), ... ?

Je pense que ecrire directement un objet n'est pas terrible (voir impossible). Notament un TBitmap qui repose sur un handle, donc géré par Windows.
En supposant que tu utilise un TBitmap, ce que je te conseille de faire, c'est de
- sauver ton bitmap dans un TMemoryStream (TBitmap.SaveToStream(...)),
-d'enregistrer ce stream dans ton fichier map
pour l'ecriture, et l'inverse pour la lecture:
- charger ton fichier map dans un stream
- charger ton bitmap despuis ce stream (TBitmap.LoadFromStream(...)).
3
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
23 juin 2009 à 22:02
essaye de voir si ca marche en passant par un buffer temporaire
const
  MAP_SIZE = 307254;
var
  buff: array[0..MAP_SIZE-1] of byte;
  m: pointer;
begin
  m := MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  if m = nil then
    raise Exception.Create('pb obtention map');

  CopyMemory(@buff[0], m); //apres ca tu peux evaluer buff pour voir si ce qu'il y a dedans semble correct
  mem.write(buff[0], MAP_SIZE); 
end;
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
26 juin 2009 à 11:36
ben je suppose que oui, pas de certitude mais ça semblerait logique sinon si l'application plante le fichier resterait à chaque fois dans la mémoire
voir le message de Guillemouze du jeudi 25 juin 2009 à 00:34:16

 
@+
Cirec

<hr siz="" />
3
Matware456 Messages postés 19 Date d'inscription jeudi 23 novembre 2006 Statut Membre Dernière intervention 27 août 2009
23 juin 2009 à 19:16
Oui c'était un TImage, je vais essayer avec ta méthode ! Merci pour ton aide ! :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Matware456 Messages postés 19 Date d'inscription jeudi 23 novembre 2006 Statut Membre Dernière intervention 27 août 2009
23 juin 2009 à 20:44
Çà fonctionne mais partiellement, je n'arrive pas à déplacer les octets du fichier mappé vers le TMemoryStream, mon CopyMemory :
CopyMemory(mem.Memory,MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,0),307254);
Ne marche pas, et ceci non plus :
mem.Write(MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,0)^,307254);
Et je n'arrive pas appeler la fonction SetPointer...
0
Matware456 Messages postés 19 Date d'inscription jeudi 23 novembre 2006 Statut Membre Dernière intervention 27 août 2009
24 juin 2009 à 22:44
Yeah, ça marche : Guillemouze, t'es un dieu ! =D

Par contre ya un truc qui m'échappe maintenant, le fichier mappé s'efface dès que je ferme l'application alors qu'il devrait rester en mémoire, ça marchait pourtant avant, et tout d'un coup, je me retrouve avec un GetLastError qui renvoie 2 (fichier introuvable), peux-tu, une dernière fois, m'aider à retrouver ce fichier mappé ?

Merci énormément pour ton aide,
Matware456
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
25 juin 2009 à 00:34
"Guillemouze, t'es un dieu" En fait je suis juste son prophete. Le "patron" prefere rester anonyme

Alors la, bonne question. Il me semble que le fichier est detruit quand tu fais CloseMapHandle ou un truc du genre. Mais a mon avis, Windows tient une liste des applications qui on ce MapFile ouvert. Si il sont tous fermés, je pense qu'il detruit le MapFile. Sinon, tu risquerai de te retrouver avec un paquet de memoire perdue si les applications ne liberent pas la memoire (de la meme maniere que quand tu termine un exe, windows libere automatiquement la memoire allouée par celui-ci)
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
25 juin 2009 à 10:29
Salut,

si le fichier n'est plus disponible c'est que toutes les applications qui l'utilisait ont fermée le Handle :

"A shared file mapping object will not be destroyed until all processes that use it close their handles to it by using the
CloseHandle function."

voir MSDN: http://msdn.microsoft.com/en-us/library/aa366878(VS.85).aspx

 
@+
Cirec

<hr siz="" />
0
Matware456 Messages postés 19 Date d'inscription jeudi 23 novembre 2006 Statut Membre Dernière intervention 27 août 2009
25 juin 2009 à 16:59
Je ferme le Handle uniquement lorsque j'affiche mon fichier mappé, si je ne fais que stocker l'image dans le fichier puis fermer le processus et ensuite essayer de voir le fichier, ça ne marche pas...
Pourtant je ne passe pas par un CloseHandle, Delphi le fait-il automatiquement ?
0
Matware456 Messages postés 19 Date d'inscription jeudi 23 novembre 2006 Statut Membre Dernière intervention 27 août 2009
26 juin 2009 à 16:25
Ok merci, ça m'embête mais je trouverais bien une solution... Merci à vous deux !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
14 juil. 2009 à 19:41
Désolé pour ce méchant up lol mais les handles de fichier sont automatiquement fermés à la fermeture du programme (par un moyen quelconque, sauf si tu appuies longtemps sur le bouton d'arrêt de l'ordinateur bien sûr ^^), dès lors que tu les crées avec CreateFile, MapViewOfFile, etc ... Car Windows garde, semble-t-il un oeil sur tout, et que ainsi, les CloseHandle à la fermeture de l'applicatin soient presque inutiles (quoique c'est mieux de les mettre !), et ne trouvent leur véritable utilisation que lorsqu'on doit fermer un fichier/objet/fichier paginé/... pendant le programme (pour en ouvrir un autre par exemple). Bref, le seul moyen possible de garder un fichier paginé en mémoire est de garder un processus résident auquel tu enverrais des requêtes simples comme "Garde mon fichier au chaud dans la mémoire", "Redonnes-moi ce fichier", "Supprime ce fichier" par IPC. Il existe aussi un autre moyen : dumper le fichier en mémoire dans un fichier physique sur disque à la fermeture du programme, puis le charger en mémoire depuis ce fichier. Mais ce n'est malheureusement pas toujours adaptable, et il faut mettre en place des merveilles de code (gestion de l'ouverture en cas d'accès multi-processus/que faire si le fichier a été supprimé, ou pire, altéré, ...).
Bref comme tu vois pas beaucoup de solutions ...

Cordialement, Bacterius !
0
Matware456 Messages postés 19 Date d'inscription jeudi 23 novembre 2006 Statut Membre Dernière intervention 27 août 2009
27 août 2009 à 17:29
Merci pour tes conseils (et oui dans le méchant up je suis plus fort ;D) !
Mais bon je ne suis pas assez doué en Delphi pour gérer un truc aussi complexe donc je vais abandonner mon petit projet malheureusement...

@++
Matware
0
Rejoignez-nous