La mémoire partagée ne signifie pas l'envoi et la réception de données. C'est une mémoire créée pour le nombre de processus sans violation. Pour cela, vous devez suivre certains mécanismes comme les verrous afin que les données ne seront pas corrompues.
En cours 1:
CreateFileMapping()
: Il crée le Shared bloc mémoire, avec le nom fourni dans le dernier paramètre, si elle est pas déjà présent et retourne une poignée (vous pouvez l'appeler un pointeur), si réussi.
MapViewOfFile()
: Il mappe (inclut) ce bloc partagé dans l'espace d'adressage du processus et renvoie un handle (encore une fois vous pouvez dire un pointeur).
Avec ce pointeur renvoyé par MapViewOfFile()
seulement vous pouvez accéder à ce bloc partagé.
En cours 2:
OpenFileMapping()
: Si le bloc de mémoire partagée est créé avec succès par CreateFileMapping()
, vous pouvez l'utiliser avec le même nom (nom utilisé pour créer le bloc de mémoire partagée).
UnmapViewOfFile()
: Il va démapper (vous pouvez supprimer le bloc de mémoire partagée de cet espace d'adressage de processus). Lorsque vous avez fini d'utiliser la mémoire partagée (c'est-à-dire, accès, modification, etc.), appelez cette fonction.
Closehandle()
: enfin de détacher le bloc de mémoire partagée du processus, appelez ceci avec argument, handle retourné par OpenFileMapping() ou CreateFileMapping().
Bien que ces fonctions semblent simples, le comportement est difficile si les indicateurs ne sont pas sélectionnés correctement. Si vous souhaitez lire ou écrire de la mémoire partagée, spécifiez PAGE_EXECUTE_READWRITE
dans CreateFileMapping()
.
Chaque fois que vous souhaitez accéder à la mémoire partagée après l'avoir créée avec succès, utilisez FILE_MAP_ALL_ACCESS
dans MapViewOfFile()
.
Il est préférable de spécifier FALSE
(ne pas hériter du handle du processus parent) dans OpenFileMapping()
car cela évitera toute confusion.
Murali Devi fournit [exemple de code de travail pour la mémoire partagée sous Windows] (http://comsci.liu.edu/~murali/win32/SharedMemory.htm). Son exemple utilise de la mémoire, pas un fichier réel, donc c'est exactement le cas que vous décrivez. –