Création de la mémoire partagée nommée
Pour partager des données, plusieurs processus peuvent utiliser des fichiers mappés en mémoire que le fichier de pagination système stocke.
Premier processus
Le premier processus crée l’objet de mappage de fichiers en appelant la fonction CreateFileMapping avec INVALID_HANDLE_VALUE et un nom pour l’objet. À l’aide de l’indicateur PAGE_READWRITE , le processus dispose de l’autorisation de lecture/écriture sur la mémoire via toutes les vues de fichier créées.
Ensuite, le processus utilise le handle de l’objet de mappage de fichiers que CreateFileMapping retourne dans un appel à MapViewOfFile pour créer une vue du fichier dans l’espace d’adressage du processus. La fonction MapViewOfFile retourne un pointeur vers l’affichage de fichiers, pBuf
. Le processus utilise ensuite la fonction CopyMemory pour écrire une chaîne dans la vue accessible par d’autres processus.
Le fait de préfixer les noms d’objets de mappage de fichiers avec « Global\ » permet aux processus de communiquer entre eux, même s’ils se trouvent dans différentes sessions terminal server. Pour cela, le premier processus doit avoir le privilège SeCreateGlobalPrivilege .
Lorsque le processus n’a plus besoin d’accéder à l’objet de mappage de fichiers, il doit appeler la fonction CloseHandle . Lorsque tous les handles sont fermés, le système peut libérer la section du fichier de pagination que l’objet utilise.
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#define BUF_SIZE 256
TCHAR szName[]=TEXT("Global\\MyFileMappingObject");
TCHAR szMsg[]=TEXT("Message from first process.");
int _tmain()
{
HANDLE hMapFile;
LPCTSTR pBuf;
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // maximum object size (high-order DWORD)
BUF_SIZE, // maximum object size (low-order DWORD)
szName); // name of mapping object
if (hMapFile == NULL)
{
_tprintf(TEXT("Could not create file mapping object (%d).\n"),
GetLastError());
return 1;
}
pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);
if (pBuf == NULL)
{
_tprintf(TEXT("Could not map view of file (%d).\n"),
GetLastError());
CloseHandle(hMapFile);
return 1;
}
CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR)));
_getch();
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
return 0;
}
Deuxième processus
Un deuxième processus peut accéder à la chaîne écrite dans la mémoire partagée par le premier processus en appelant la fonction OpenFileMapping en spécifiant le même nom pour l’objet de mappage que le premier processus. Ensuite, il peut utiliser la fonction MapViewOfFile pour obtenir un pointeur vers la vue de fichiers, pBuf
. Le processus peut afficher cette chaîne comme n’importe quelle autre chaîne. Dans cet exemple, la zone de message affichée contient le message « Message du premier processus » qui a été écrit par le premier processus.
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#pragma comment(lib, "user32.lib")
#define BUF_SIZE 256
TCHAR szName[]=TEXT("Global\\MyFileMappingObject");
int _tmain()
{
HANDLE hMapFile;
LPCTSTR pBuf;
hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // read/write access
FALSE, // do not inherit the name
szName); // name of mapping object
if (hMapFile == NULL)
{
_tprintf(TEXT("Could not open file mapping object (%d).\n"),
GetLastError());
return 1;
}
pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);
if (pBuf == NULL)
{
_tprintf(TEXT("Could not map view of file (%d).\n"),
GetLastError());
CloseHandle(hMapFile);
return 1;
}
MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
return 0;
}
Rubriques connexes
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour