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.
|