Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Virtus en 01 de Enero de 1970, 01:00:00 AM

Título: Sobre una DLL, un EXE y compartir memoria entre ambos
Publicado por: Virtus en 01 de Enero de 1970, 01:00:00 AM
                                Estoy haciendo un Editor 3D y los procesos de importacion de objetos esta en .DLLs (para importar 3DS, OBJ, ASE, etc...).

El problema está en que el editor (.exe) carga la DLL (LoadLibrary) en memoria y ejecuta la funcion de importacion.... dicha funcion de importacion hace varias reservas de memoria (malloc) para los vertices, poligonos, etc... cuyos punteros le pasa al .exe mediante la extructura de exportacion de la DLL... pero el .exe no tiene acceso a la memoria reservada por la .dll.

Buscando por la red, he visto que el .exe y la .dll poseen distintos HEAPs de memoria.... alguna solucion????

Salu2. Virtus                                
Título: Sobre una DLL, un EXE y compartir memoria entre ambos
Publicado por: Gunder en 01 de Enero de 1970, 01:00:00 AM
                                Pozi virtus,

lo mas facil es exportar a la dll mediante un puntero a un clase interface o funcion ( tu elijes ) una forma de reservar memoria de la heap del ejecutable. Me explico:

En el exe creas la funcion:

-- EXE.C ---

void *MyAllocMem( int _size )
{
return malloc( _size );
}

cuando llamas a la Dll con la funcion, por ejemplo, que esta exportada de la dll:

-- EXE.C ---

HRESULT InitImporter( void *_MemAllocator );

la llamas pasando el puntero a la funcion:

-- EXE.C ---

InitImporter( (void*)MyAllocMem );

En el lado de la DLL, recoges el puntero a la funcion y lo guardas en una variable:

-- DLL.C ---

void *(*MyAllocMem)(int _size);

HRESULT InitImporter( void *_MemAllocator )
{
MyAllocMem = (void *(*)(int))_MemAllocator;

y ya puedes reservar memoria que se podra liberar desde el ejecutable.
int *Memoria=MyAllocMem( 40 * 4 );
}

Si quieres liberar memoria reservada por el ejecutable desde la DLL deberas repetir la operacion para MyFreeMemm, funcion que liberaria la memoria.

Por otro lado, si estas interesado en hacerlo con un interface de clase ala COM, dimelo y te explico como es.

Ale.




}



[ Este Mensaje fue editado por: Gunder el 2002-07-04 10:49 ]                                
Título: Sobre una DLL, un EXE y compartir memoria entre ambos
Publicado por: Virtus en 01 de Enero de 1970, 01:00:00 AM
                                Hmmm, ahora he visto una web que me deja, como minimo perplejo. Segun veo, puedo usar una funcion GlobalAlloc() para reservar memoria Global a windows y ponerla como GMEM_SHARED..... La direccion es:

http://www.zetnet.co.uk/rad/dll.html


Me pregunto si esa sera otro posible solucion.

Salu2. Virtus.                                
Título: Sobre una DLL, un EXE y compartir memoria entre ambos
Publicado por: Javier en 01 de Enero de 1970, 01:00:00 AM
                                Si estás usando Visual C++, puedes emplear esto para crear una sección de datos compartida (ejemplo pillado en la MSDN):

#pragma data_seg(".sdata")
  void* datos;
#pragma data_seg()

Espero que te sirva, un saludo.