![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
#6
|
|||
|
|||
|
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. |
|
|
|