Ver Mensaje Individual
  #3  
Antiguo 19-02-2004
cht666cht cht666cht is offline
Miembro
 
Registrado: nov 2003
Posts: 14
Reputación: 0
cht666cht Va por buen camino
Mira, he estado mirando el código que utilicé para compartir un record entre dos aplicaciones. Básicamente seria algo asi:

1.
Tanto en el EXE como en la DLL has de declarar el mismo record en el que estará la información que quieres compartir:

type

TDatos = packed record
a, b, c: Integer;
end;
PDatos = ^TDatos; // el tipo PDatos será un puntero a un TDatos

y una variable para acceder al mismo:

var
Datos: PDatos;


2.
El siguiente paso es reservar la memoria, y eso lo ha de hacer o el EXE o la DLL, en una funcíón de inicialización, en el OnCreate o donde lo creas conveniente:

FileMappingObject := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(TDatos), 'IDENTIFICADOR_DEL_FILEMAPPING');
Datos := MapViewOfFile(FileMappingObject, FILE_MAP_ALL_ACCESS, 0, 0, 0);
Mutex := CreateMutex(nil, False, 'IDENTIFICADOR_DEL_MUTEX');

También se crea un mutex, que es el objeto mediante el cual sincronizaremos el acceso a la memoria. recuerda declarar las variables 'FileMappingObject' y 'Mutex' , de tipo THandle.

y para liberar la memoria y el mutex:

CloseHandle(Mutex);
UnmapViewOfFile(Datos);
CloseHandle(FileMappingObject);

Esto en la funcion de finalización, en el OnDestroy, etc...

3.
En el resto de procesos que vayan a acceder a esa zona de memoria, obtendras el puntero y el identificador del mutex asi:

FileMappingObject := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, 'IDENTIFICADOR_DEL_FILEMAPPING');
Datos := MapViewOfFile(FileMappingObject, FILE_MAP_ALL_ACCESS, 0, 0, 0);
Mutex := OpenMutex(SYNCHRONIZE, True, 'IDENTIFICADOR_DEL_MUTEX');

o sea, que si el paso 2 lo has hecho en la DLL, en el EXE tendrás que hacer esto.

usa el mismo codigo del paso 2 para liberar los objetos.

4.
Ahora ya puedes acceder a la estructura 'Datos' tanto desde el EXE como de la DLL. Para eso utiliza este código:

// esperar hasta tener acceso
if WaitForSingleObject(Mutex, INFINITE) <> WAIT_FAILED then
begin
// aqui se puede trabajar con 'Datos'
...
// al final liberar el mutex para que otro proceso pueda acceder
ReleaseMutex(Mutex);
end;

Esto es todo, espero que te sirva para lo que necesitas.
Un saludo.
Responder Con Cita