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 objeto 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 exige 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 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 do primeiro processo. Em seguida, ele pode usar a função MapViewOfFile para obter um ponteiro para a exibição de arquivo, pBuf. O processo pode exibir essa cadeia de caracteres como faria com qualquer outra cadeia de caracteres. Neste 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;
}

Compartilhando arquivos e memória