Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema Con Dlls Y Memoria Reservada

Iniciado por tamat, 30 de Julio de 2003, 02:42:03 AM

« anterior - próximo »

tamat

 Tengo una aplicacion que carga DLLs y de cada una saca instancias a una clase propia implementada dentro de la DLL.
Dichas clases heredan de una clase base que contiene un std::string y que lo utilizo a modo de textbuffer interno de cada clase de modo que cada instancia tiene un registro de mensajes donde ademas pueden volcar su output como posibles errores en ejecucion.

Todo funcionaba bien hasta que me ha dado por forzar el sistema, ha sido entonces cuando he topado con un error, sucede cuando trato de añadir texto al buffer de una clase, dado que la implementacion interna de un string se realloca en funcion de lo que necesite para albergar la cadena de texto pues hay momento en los que la app tiene que liberar el espacio que reservó inicialmente desde la DLL y se produce un error.

Tenia conocimiento de que no es bueno liberar desde la app lo que la dll ha reservado y viceversa pero ahora me topo de lleno con el problema y he perdido mucho tiempo tratando de buscar alguna solucion, he intentado redirigir toda la manipulación del string a funciones internas de la clase pero aun así me da problemas.

De entre las posibles soluciones que se me ocurren está la de alterar las propiedades del compilador para que app y dll compartan mismo heap ya que parece ser ese el problema, o tal vez utilizar otras STL (ahora uso las de MS), quiza con las STLport tenga mejor suerte.

Alguien me puede ayudar?

P.D: Esta te la dedico a ti, ma]mestre, xD
Por un stratos menos tenso


tamat

 Muchas gracias ethernet, lo de arreglar los bugs de las STL de MS ya lo hice hace un par de semanas por el mismo problema (despues de perder 4 dias) siguiendo esa web que sale en el link.
Anoche ya me sugirieron en efnet que probase con STLport así que será lo proximo que intente, ahora estaba probando sobreescribiendo el operador new como indica el tuto de flipcode solo que no se si tengo que incluir el archivo en todos mis archivos o solo en uno del que dependan todos...

En fin, luego os cuento, gracias.

(tamat)
Por un stratos menos tenso

ethernet

 Yo para solucionar ese problema lo q hago es no usar STL en el interface de la DLL XD.

Por cierto, uso STL de SGI www.sgi.com/tech/stl

saludos

tamat

 Acabo de instalar STLport y ya no me da ningun problema (de momento) así que puedo dormir tranquilo un par de dias.
Gracias :)
Por un stratos menos tenso

MA]Mestre

 Como mas o menos has deducido una DLL y una APP no comparten montículo ( heap ). Así pues la reserva de memoria del malloc o new ( que reservan mem del monticulo ), deben ser liberadas desde la DLL o APP correspondiente.

Por otro lado, las DLL no son "procesos a parte" de las APP que las utilizan. Las DLL se integran en el espacio de direcciones de proceso ( de 4GB ) de una aplicación. Si no fuera así la APP no podria llamar a ninguna función de la DLL.

La arquitectura Windows ofrece VirtualAlloc y VirtualFree que no reservan memoria del monticulo, con ellas puedes solucionar tu problema tamat.

Si quieres ir más alla, podriamos decir que una DLL se puede convertir en un caballo de troya. Existen unas herramientas en Win32Api denominadas Hooks con las cuales se pueden introducir un DLL en un espacio de direcciones de memoria que un programa cualquiera ( no es tan facil como decirlo ), así pues tomar el "control" sobre el.

Un saludo tamat, siento no sabes nada de STL, de eso no puedo decir nada.

P.D: etthernett tu dedicación me ha parecido un poco ácida.  :(






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.