Cómo: Compartir datos entre procesos mediante archivos asignados en memoria

Seleccione idioma Seleccione idioma
Id. de artículo: 188535 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Expandir todo | Contraer todo

Resumen

Aunque generalmente es la forma más sencilla y más eficaz de compartir datos entre dos procesos mediante tablas compartidas, es posible utilizar archivos asignados en memoria para realizar la misma tarea. En el siguiente ejemplo utiliza las funciones Win32 CreateFileMapping MapViewOfFile y UnmapViewOfFile para utilizar el archivo de paginación de Windows como un archivo asignado en memoria y pasar una cadena entre dos copias de Visual FoxPro.

Nota: Este ejemplo está pensado para su uso sólo en Windows NT y se ha escrito y probado con Windows NT 4.0.

Más información

  1. Iniciar una instancia de Visual FoxPro.
  2. Create and run a program containing the following code:
          DECLARE INTEGER CreateFileMapping IN kernel32.DLL INTEGER hFile, ;
             INTEGER lpFileMappingAttributes, INTEGER flProtect, ;
             INTEGER dwMaximumSizeHigh, INTEGER dwMaximumSizeLow, ;
             STRING lpName
    
          DECLARE INTEGER MapViewOfFile IN kernel32.DLL ;
             INTEGER hFileMappingObject, INTEGER dwDesiredAccess, ;
             INTEGER dwFileOffsetHigh, INTEGER dwFileOffsetLow, ;
             INTEGER dwNumberofBytesToMap
    
          DECLARE INTEGER GetLastError IN kernel32.DLL
    
          DECLARE INTEGER lstrcpy IN kernel32.DLL ;
             INTEGER lpString1, STRING @lpString2
    
          DECLARE INTEGER UnmapViewOfFile IN kernel32.DLL ;
             INTEGER lpBaseAddress
    
          DECLARE INTEGER CloseHandle IN kernel32.DLL INTEGER hObject
    
          #DEFINE page_writeread 4
          #DEFINE page_readwrite 4
          #DEFINE file_map_read 4
          #DEFINE file_map_write 2
    
          * FFFFFFFF (2^32) means: Use the Windows NT pagefile as the memory-
          * mapped file.
          * Otherwise, you could substitute a handle that you have created.
          #DEFINE usepagefile 2^32
    
          * Arbitrary name for the file mapping.
          szename = "hello"
    
          * This says: Create a file-mapping object from the pagefile,
          * using a default security descriptor, giving Read/Write access
          * to the committed region, with a maximum size of 4096 bytes,
          * named szeName, and return the handle to this file-mapping
          * object in variable 'handle'.
          handle = createfilemapping(usepagefile, 0, page_readwrite, 0, ;
             4096, szename)
          IF handle = 0
             WAIT WINDOW "CreateFileMapping failed - LastError: " ;
                + LTRIM(STR(getlasterror()))
             RETURN
          ENDIF
    
          * This says: Given the handle obtained above, give full access
          * to the file-mapping object, starting at offset 0, and map the
          * entire file into my process' address space.
          addhandle = mapviewoffile(handle, file_map_write, 0, 0, 0)
          IF handle = 0
             WAIT WINDOW "MapViewOfFile failed - LastError: " ;
                + LTRIM(STR(getlasterror()))
             RETURN
          ENDIF
    
          * Now, the file can be treated just like a memory address.
          * Use lstrcpy to copy the FoxPro string to addhandle, the
          * starting address of the mapped view.
    
          * The text you want to write to the shared memory-mapped
          * file goes here.
          stxt1 = "Hello world, I'm writing to a shared page file."
          ret = lstrcpy(addhandle, @stxt1)
    
          * When the message box appears, run the corresponding program
          * to read the memory-mapped file in a second instance of FoxPro.
          * Unmapping the file view and closing the handle removes the text
          * from the file.
          = MESSAGEBOX("Now switch to the other application")
    
          * When we've finished with it, unmap the file-mapping object
          * from our address space and release the handle.
          =UnmapViewOfFile (addhandle)
          =CloseHandle(handle)
    								
  3. When the message box containing the text "Now switch to the other application" appears, run a second instance of Visual FoxPro, create and run a program containing the following code:
          DECLARE INTEGER CreateFileMapping IN kernel32.DLL INTEGER hFile, ;
             INTEGER lpFileMappingAttributes, INTEGER flProtect, ;
             INTEGER dwMaximumSizeHigh, INTEGER dwMaximumSizeLow, ;
             STRING lpName
    
          DECLARE INTEGER MapViewOfFile IN kernel32.DLL ;
             INTEGER hFileMappingObject, INTEGER dwDesiredAccess, ;
             INTEGER dwFileOffsetHigh, INTEGER dwFileOffsetLow, ;
             INTEGER dwNumberofBytesToMap
    
          DECLARE INTEGER GetLastError IN kernel32.DLL
    
          DECLARE INTEGER lstrcpy IN kernel32.DLL ;
             STRING @lpString1, INTEGER lpString2
    
          DECLARE INTEGER UnmapViewOfFile IN kernel32.DLL ;
             INTEGER lpBaseAddress
    
          DECLARE INTEGER CloseHandle IN kernel32.DLL INTEGER hObject
    
          #DEFINE page_writeread 4
          #DEFINE page_readwrite 4
          #DEFINE file_map_read 4
          #DEFINE file_map_write 2
    
          * FFFFFFFF (2^ 32) means: Use the Windows NT pagefile as the memory-
          * mapped file. Otherwise, you could substitute a handle that you
          * have created.
          #DEFINE usepagefile 2^32
          #DEFINE maxbuffersize 254
    
          * Arbitrary name for the file mapping.
          szename = "hello"
    
          * This says: Create a file-mapping object from the pagefile,
          * using a default security descriptor, giving Read/Write access
          * to the committed region, with a maximum size of 4096 bytes,
          * named szeName, and return the handle to this file-mapping
          * object in variable handle.
          handle = createfilemapping(usepagefile, 0, page_readwrite, ;
             0, 4096, szename)
          IF handle = 0
             WAIT WINDOW "CreateFileMapping failed - LastError: " ;
                + LTRIM(STR(getlasterror()))
             RETURN
          ENDIF
    
          * This says: Given the handle obtained above, give full
          * access to the file-mapping object, starting at offset 0,
          * and map the entire file into my process' address space.
          addhandle = mapviewoffile(handle, file_map_write, 0, 0, 0)
          IF handle = 0
             WAIT WINDOW "MapViewOfFile failed - LastError: " ;
                + LTRIM(STR(getlasterror()))
             RETURN
          ENDIF
    
          * Now, the file can be treated just like a memory address.
          * Use lstrcpy to copy the Foxpro string to the Foxpro
          * string stxt2 from the starting address of the mapped view.
    
          * Buffer to receive passed string.
          stxt2 = SPACE(254)
          ret = lstrcpy(@stxt2, addhandle)
    
          =MESSAGEBOX ("String I read was: " + stxt2)
    
          * When we've finished with it, unmap the file-mapping object
          * from our address space and release the handle.
    
          =UnmapViewOfFile(addhandle)
          =CloseHandle (handle)
    								
  4. La segunda instancia de Visual FoxPro debe mostrar la cadena escrita en el archivo de paginación por la primera instancia. Para desasignar el archivo de paginación y libera todos los identificadores, presione Aceptar en los cuadros de mensaje en ambas instancias de Visual FoxPro.
El código de ejemplo presentado aquí es complejo. Respuestas a preguntas acerca de este ejemplo pueden requerir que ingenieros de soporte técnico de Microsoft dedique algún tiempo a sí mismos familiarice con el código.

Referencias

Ayuda del SDK de Win32; tema: "CreateFileMapping"; "MapViewOfFile"; "UnmapViewOfFile"

Para obtener más información sobre los usos de los archivos asignados en memoria:

"Avanzadas de Windows: Guía del desarrollador de la para la API de Win32 para Windows NT 3.5 y Windows 95," Jeffry Richter, capítulo 7, Microsoft Press

Propiedades

Id. de artículo: 188535 - Última revisión: domingo, 23 de febrero de 2014 - Versión: 2.0
La información de este artículo se refiere a:
  • Microsoft Visual FoxPro 5.0 Standard Edition
  • Microsoft Visual FoxPro 5.0a
Palabras clave: 
kbnosurvey kbarchive kbmt kbhowto KB188535 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 188535

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com