Pergunta

Estou criando uma DLL C ++ Win32 com alguns dados globais. Há um mapa DST :: definido globalmente e existem funções exportadas na DLL que escrevem dados no mapa (depois de adquirir um bloqueio de gravação, claro).

Meu problema é que, quando eu chamo a função de gravação de dentro da dll DLLMain, ele funciona sem problemas. Mas quando eu carrego a DLL de outro programa e chama a função que grava dados no mapa global, ela me dá esse erro:

WindowsError: exception: access violation reading 0x00000008

Há algo que pode ser feito sobre isso? A mesma função quando chamada da DLLMain tem acesso aos dados globais na DLL, mas quando chamados de um processo diferente, ele não tem acesso aos dados globais. Conselho por favor.

Estou usando o compilador TDM-Mingw GCC 4.4.0.

EDITAR:OK, eu descobri qual é o problema e obrigado pela ajuda pessoal, mas o problema não estava com uma questão de construtor ou incapacidade de ter mapas no espaço global, mas um problema no impulso :: python que eu sou usando. Eu o testei, mas como estava ligando para a DLL de Python ou talvez algo, o módulo URLLIB2 não estava sendo carregado na DLL. Agora eu tenho que ver como consertar isso.

Foi útil?

Solução

Parece o construtor de std::map ainda não funcionou quando seu código foi chamado. A vida útil dos não-PODs globais em uma DLL Win32 é bastante complicada, e não tenho certeza de como a Mingw lida especificamente. Mas pode ser que a maneira como você está compilando a DLL, você definiu sua própria função (DllMain?) Como ponto de entrada e, assim, substituiu a rotina de inicialização do CRT que chama construtores.

Outras dicas

Um erro de leitura em um endereço de memória tão baixo geralmente significa que você está tentando acessar um ponteiro nulo em algum lugar. Você pode mostrar seu código real?

Você precisa usar a memória compartilhada, porque os diferentes processos têm espaços de endereço separados. Eu acho que você não terá o std :: mapa em execução. Eu recomendaria usar o MapViewOffile, CreateFilemapping, OpenFilemapping, ... e dados antigos simples. Pergunte ao Google / MSDN.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top