Compartilhar via


Como eu compartilhar dados em minha DLL com um aplicativo ou com outras DLLs?

Win32 DLLs são mapeadas no espaço de endereço do processo de chamada.Por padrão, cada processo usando uma DLL possui sua própria instância do todas as variáveis de DLLs global e estáticas.Se sua DLL precisa compartilhar dados com outras instâncias dele carregado por outros aplicativos, você pode usar qualquer uma das seguintes abordagens:

  • Criar seções de dados nomeado usando o data_seg pragma.

  • Use arquivos de memória mapeada.Consulte a documentação "Managing memória-Mapped arquivos no Win32" deBiblioteca MSDN.

Aqui está um exemplo do uso de data_seg pragma:

#pragma data_seg (".myseg")
   int i = 0; 
   char a[32]n = "hello world";
#pragma data_seg()

data_seg pode ser usado para criar uma nova seção nomeada (.myseg neste exemplo).O uso mais comum é chamar o .shared de segmento de dados para fins de esclarecimento.Em seguida, especifique os atributos de compartilhamento corretos para esta nova seção de dados nomeado no arquivo .def ou com a opção de vinculador /SECTION:.MYSEC, RWS.

Existem restrições a serem consideradas antes que um segmento de dados compartilhado:

  • Todas as variáveis em um segmento de dados compartilhada devem ser inicializadas estaticamente.No exemplo acima, i é inicializada para 0 e um é inicializados para Olá mundo de 32 caracteres.

  • Todas as variáveis compartilhadas são colocadas na DLL compilada no segmento de dados especificado.Arrays muito grandes podem resultar em DLLs muito grandes.Isso é verdadeiro de todas as variáveis global inicializadas.

  • Nunca armazenam informações específicas de processo em um segmento de dados compartilhados.A maioria das estruturas de dados do Win32 ou valores (sistema autônomo trata) são realmente válidas apenas dentro do contexto de um único processo.

  • Cada processo obtém seu próprio espaço de endereço.É muito importante que ponteiros nunca são armazenados em uma variável contida em um segmento de dados compartilhado.Um ponteiro pode ser perfeitamente válido em um aplicativo, mas não em outro.

  • É possível que a DLL do próprio poderia obter carregada em um endereço diferente nos espaços de endereço virtual de cada processo.Não é seguro ter ponteiros para funções na DLL ou outras variáveis compartilhadas.

Observe que esses três últimos pontos se aplicam aos arquivos mapeados na memória e segmentos de dados compartilhado.

Arquivos mapeados na memória têm uma vantagem em relação a seções de dados compartilhados como o início do arquivo de memória mapeada é conhecido.Os desenvolvedores podem implementar comportamento semelhante ao ponteiro usando "offset do início da seção de memória compartilhada" em todos os dados localizados dentro de memória compartilhada.__based ponteiros são altamente recomendável para tornar essa rápida e fácil.No entanto, é importante lembrar que a base (ou o início do arquivo de memória mapeada) pode ser diferente em cada processo, isso a variável de armazenamento de base de __based ponteiros não podem ser na memória compartilhada.

Essas restrições tem implicações importantes para classes C++.

  • Classes com funções virtual sempre contém os ponteiros de função.Classes com funções virtual nunca devem ser armazenadas em segmentos de dados compartilhado nem na memória arquivos mapeados.Isso é particularmente importante para classes do MFC ou classes que herdam da MFC.

  • sistema autônomo membros de dados estático são implementados sistema autônomo o equivalente de variáveis global.Isso significa que cada processo deve ter sua própria cópia de membros de dados estático da classe.Classes com membros de dados estático não devem ser compartilhadas.

  • O requisito de inicialização de um segmento de dados compartilhados causa um problema específico de classes C++.Se você tiver algo sistema autônomo CTest Counter(0); em um segmento de dados compartilhados, o Counter objeto é inicializado em cada processo conforme eles carregam a DLL, potencialmente zera sistema autônomo dados do objeto cada vez. Isso é muito diferente do que os tipos de dados intrínseca que são inicializados pelo vinculador quando cria a DLL.

Devido a essas restrições, da Microsoft não recomenda a compartilhar objetos C++ entre processos.Em geral, se você quiser usar C++ para compartilhar dados entre processos, escrever uma classe que usa um arquivo mapeado para memória internamente para compartilhar dados, mas siga não compartilhamento instâncias da classe propriamente ditas.Isso pode exigir cuidados especiais no desenvolvimento de tal classe, mas permite que os desenvolvedores de aplicativos controlar totalmente os efeitos colaterais de compartilhamento de dados.

Para obter mais informações sobre como criar seções de dados nomeado, consulte os seguintes artigos da Base de dados de Conhecimento em http://suporte.Microsoft.com:

  • "Como compartilhar dados entre diferentes mapeamentos de uma DLL" (Q125677).

  • "Especificação de dados compartilhados e compartilhados em uma DLL" (Q100634).

  • "Todos os dados em uma DLL de compartilhamento" (Q109619).

  • "Memória em seções de código compartilhadas não é compartilhada entre sessões do Terminal servidor" (Q251045)

Consulte também

Conceitos

Perguntas freqüentes sobre a DLL