Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Sobre una DLL, un EXE y compartir memoria entre ambos

Iniciado por Virtus, 01 de Enero de 1970, 01:00:00 AM

« anterior - próximo »

Virtus

                                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                                

Gunder

                                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 ]                                
riticar, critica hasta el mas tonto.

Virtus

                                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.                                

Javier

                                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.
                               






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.