Criando memória compartilhada nomeada
Para compartilhar dados, vários processos podem usar arquivos mapeados na memória que o arquivo de paginação do sistema armazena.
Observação
O código no exemplo exigirá privilégios administrativos em tempo de execução.
Primeiro processo
O primeiro processo cria o objeto de mapeamento de arquivo chamando a função CreateFileMapping com INVALID_HANDLE_VALUE e um nome para o objeto. Usando o sinalizador PAGE_READWRITE, o processo tem permissão de leitura/gravação para a memória por meio de qualquer exibição de arquivo criada.
Em seguida, o processo usa o identificador de objeto de mapeamento de arquivo que CreateFileMapping retorna em uma chamada para MapViewOfFile para criar uma exibição do arquivo no espaço de endereço do processo. A função MapViewOfFile retorna um ponteiro para a exibição do arquivo, pBuf
. Em seguida, o processo usa a função CopyMemory para gravar uma cadeia de caracteres no modo de exibição que pode ser acessada por outros processos.
Prefixar os nomes dos objetos de mapeamento de arquivos com "Global\" permite que os processos se comuniquem entre si, mesmo que estejam em sessões diferentes do servidor de terminal. Isso requer que o primeiro processo tenha o privilégio SeCreateGlobalPrivilege.
Quando o processo não precisar mais de acesso ao objeto de mapeamento de arquivo, ele deverá chamar a função CloseHandle. Quando todos os identificadores estiverem fechados, o sistema poderá liberar a seção do arquivo de paginação que o objeto usa.
#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;
}
Segundo processo
Um segundo processo pode acessar a cadeia de caracteres gravada na memória compartilhada pelo primeiro processo chamando a função OpenFileMapping, especificando o mesmo nome para o objeto de mapeamento do primeiro processo. Em seguida, ele pode usar a função MapViewOfFile para obter um ponteiro para a exibição do arquivo pBuf
. O processo pode exibir essa cadeia de caracteres como faria com qualquer outra cadeia de caracteres. No exemplo, a caixa de mensagem exibida contém a mensagem "Mensagem do primeiro processo" que foi gravada pelo primeiro 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;
}