Creazione di memoria condivisa denominata
Per condividere i dati, più processi possono usare file mappati alla memoria archiviati dal file di paging del sistema.
Nota
Il codice in questo esempio richiederà privilegi amministrativi in fase di esecuzione.
Primo processo
Il primo processo crea l'oggetto di mapping del file chiamando la funzione CreateFileMapping con INVALID_HANDLE_VALUE e un nome per l'oggetto. Usando il flag PAGE_READWRITE , il processo dispone dell'autorizzazione di lettura/scrittura per la memoria tramite qualsiasi vista file creata.
Il processo usa quindi l'handle dell'oggetto di mapping file restituito da CreateFileMapping in una chiamata a MapViewOfFile per creare una visualizzazione del file nello spazio indirizzi del processo. La funzione MapViewOfFile restituisce un puntatore alla visualizzazione file, pBuf
. Il processo usa quindi la funzione CopyMemory per scrivere una stringa nella visualizzazione a cui è possibile accedere da altri processi.
Il prefisso dei nomi degli oggetti di mapping dei file con "Global\" consente ai processi di comunicare tra loro anche se si trovano in sessioni del server terminal diverse. Ciò richiede che il primo processo abbia il privilegio SeCreateGlobalPrivilege.
Quando il processo non deve più accedere all'oggetto di mapping file, deve chiamare la funzione CloseHandle. Quando tutti gli handle vengono chiusi, il sistema può liberare la sezione del file di paging utilizzato dall'oggetto.
#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;
}
Secondo processo
Un secondo processo può accedere alla stringa scritta nella memoria condivisa dal primo processo chiamando la funzione OpenFileMapping specificando lo stesso nome per l'oggetto di mapping come primo processo. Può quindi usare la funzione MapViewOfFile per ottenere un puntatore alla visualizzazione file, pBuf
. Il processo può visualizzare questa stringa come qualsiasi altra stringa. In questo esempio la finestra di messaggio visualizzata contiene il messaggio "Message from first process" scritto dal primo processo.
#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;
}