Partilhar via


Escopo da memória alocada

Toda a memória que um processo aloca usando as funções de alocação de memória ( HeapAlloc, VirtualAlloc, GlobalAlloc ou LocalAlloc) é acessível apenas para o processo. No entanto, a memória alocada por uma DLL é alocada no espaço de endereço do processo que chamou a DLL e não está acessível a outros processos usando a mesma DLL. Para criar memória compartilhada, você deve usar o mapeamento de arquivo.

O mapeamento de arquivo nomeado fornece uma maneira fácil de criar um bloco de memória compartilhada. Um processo pode especificar um nome quando usa a função CreateFileMapping para criar um objeto de mapeamento de arquivo. Outros processos podem especificar o mesmo nome para a função CreateFileMapping ou OpenFileMapping para obter um identificador para o objeto de mapeamento.

Cada processo especifica seu identificador para o objeto de mapeamento de arquivo na função MapViewOfFile para mapear uma exibição do arquivo em seu próprio espaço de endereço. As exibições de todos os processos para um único objeto de mapeamento de arquivo são mapeadas para as mesmas páginas fragmentáveis de armazenamento físico. No entanto, os endereços virtuais das exibições mapeadas podem variar de um processo para outro, a menos que a função MapViewOfFileEx seja usada para mapear a exibição em um endereço especificado. Embora fragmentáveis, as páginas de armazenamento físico usadas para uma exibição de arquivo mapeada não são globais; eles não são acessíveis a processos que não mapearam uma exibição do arquivo.

Todas as páginas confirmadas mapeando uma exibição de um arquivo são liberadas quando o último processo com uma exibição do objeto de mapeamento termina ou cancela a exibição chamando a função UnmapViewOfFile . Neste momento, o arquivo especificado (se houver) associado ao objeto de mapeamento é atualizado. Um arquivo especificado também pode ser forçado a atualizar chamando a função FlushViewOfFile .

Para obter mais informações, consulte Mapeamento de arquivos. Para obter um exemplo de memória compartilhada em uma DLL, consulte Usando memória compartilhada em uma biblioteca de Dynamic-Link.

Se vários processos tiverem acesso de gravação à memória compartilhada, você deverá sincronizar o acesso à memória. Para obter mais informações, consulte Sincronização.