Criando memória compartilhada nomeada
Para compartilhar dados, vários processos podem usar arquivos mapeados em memória que o arquivo de paginação do sistema armazena.
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 quaisquer exibições de arquivo criadas.
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 de arquivo. pBuf
Em seguida, o processo usa a função CopyMemory para gravar uma cadeia de caracteres na exibição que pode ser acessada por outros processos.
Prefixar os nomes de objetos de mapeamento de arquivo com "Global\" permite que os processos se comuniquem entre si, mesmo que estejam em sessões de servidor de terminal diferentes. Isso requer que o primeiro processo tenha o privilégio SeCreateGlobalPrivilege .
Quando o processo não precisa mais de acesso ao objeto de mapeamento de arquivo, ele deve chamar a função CloseHandle . Quando todos os identificadores são fechados, o sistema pode 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 que o primeiro processo. Em seguida, ele pode usar a função MapViewOfFile para obter um ponteiro para o modo de exibição de arquivo. pBuf
O processo pode exibir essa cadeia de caracteres como qualquer outra cadeia de caracteres. Neste exemplo, a caixa de mensagem exibida contém a mensagem "Mensagem do primeiro processo" que foi escrita 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;
}
Tópicos relacionados