Pregunta

Estoy creando una DLL de C++ Win32 con algunos datos globales.Hay un std::map definido globalmente y hay funciones exportadas en el dll que escriben datos en el mapa (después de adquirir un bloqueo de escritura, por supuesto).

Mi problema es que cuando llamo a la función de escritura desde dentro del dll DllMain, funciona sin ningún problema.Pero cuando cargo el dll desde otro programa y llamo a la función que escribe datos en el mapa global, me da este error:

WindowsError: exception: access violation reading 0x00000008

¿Hay algo que se pueda hacer al respecto?La misma función, cuando se llama desde DllMain, tiene acceso a los datos globales en el dll, pero cuando se llama desde un proceso diferente, no tiene acceso a los datos globales.Por favor aconséjame.

Estoy usando el compilador TDM-MinGW gcc 4.4.0.

EDITAR:Ok, descubrí cuál es el problema y gracias por la ayuda, pero el problema no fue un problema del constructor o la incapacidad de tener mapas en el espacio global, sino un problema en el boost::python que estoy usando.Lo había probado, pero como estaba llamando al dll desde Python o tal vez algo así, el módulo urllib2 no se cargaba en el dll.Ahora tengo que ver cómo solucionarlo.

¿Fue útil?

Solución

Parece que el constructor de std::map no se ha ejecutado aún cuando el código fue llamado. Curso de la vida de los no-POD globales en un Win32 DLL es bastante complicado, y no estoy seguro de cómo maneja MinGW específicamente. Pero puede ser que la forma en que está compilando el archivo DLL, que ha establecido su propia función (DllMain?) Como punto de partida, y por lo tanto hizo caso omiso de la rutina de inicialización CRT que llama a los constructores.

Otros consejos

Un error de lectura en una dirección de memoria tan baja generalmente significa que usted está tratando de acceder a un puntero NULL en alguna parte. Se puede mostrar su código real?

Hay que utilizar la memoria compartida, ya que los diferentes procesos tienen espacios de direcciones separadas. Creo que no se va a std :: mapa consecutivo. Yo recomiendo usar MapViewOfFile, CreateFileMapping, OpenFileMapping, ... y los datos llanura de edad. Pedir a Google / MSDN.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top