¿Cómo almacenar datos y sacarlos de los archivos de mapeo de memoria usando CopyMemory en VBA?

Estoy tratando de construir un sistema informático distributivo que use archivos de mapeo de memoria para coordinar el trabajo entre varias PC en red, todo a través de VBA. Dicho de otra manera, quiero que un grupo de computadoras en red trabajen al mismo tiempo de manera coordinada en un solo proyecto que se puede dividir fácilmente en diferentes partes. Una PC tarda más de 13 horas en completar el proyecto, lo que no es práctico para mi cliente.

Quiero almacenar información en los archivos de mapeo de memoria que ayudarán a las PC a trabajar en el proyecto de manera coordinada (es decir, sin duplicación de trabajo, evitar problemas de carrera, etc.). He intentado usar otros tipos de archivos para lograr esto y causa problemas de carrera de archivos o lleva demasiado tiempo. Entonces, como se sugirió en este foro, estoy intentando archivos de mapeo de memoria.

Soy nuevo en archivos de mapeo de memoria y computación distributiva. Tiene que hacerse en VBA. Hasta donde sé, tengo que especificar que el archivo se guarde en un directorio de nuestra red (unidad Z aquí) al que todas las PC tienen acceso. He improvisado algunos códigos de varios lugares:

Option Explicit

Private Const PAGE_READWRITE As Long = &H4
Private Const FILE_MAP_WRITE As Long = &H2
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const OPEN_ALWAYS = 4
Private Const FILE_ATTRIBUTE_NORMAL = &H80

Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, _
                                         ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, _
                                         ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, _
                                         ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long

Private Declare Function CreateFileMapping Lib "kernel32.dll" Alias "CreateFileMappingA" ( _
     ByVal hFile As Long, _
     ByVal lpFileMappigAttributes As Long, _
     ByVal flProtect As Long, _
     ByVal dwMaximumSizeHigh As Long, _
     ByVal dwMaximumSizeLow As Long, _
     ByVal lpName As String) As Long

Private Declare Function MapViewOfFile Lib "kernel32.dll" ( _
     ByVal hFileMappingObject As Long, _
     ByVal dwDesiredAccess As Long, _
     ByVal dwFileOffsetHigh As Long, _
     ByVal dwFileOffsetLow As Long, _
     ByVal dwNumberOfBytesToMap As Long) As Long

#If VBA7 Then
Public Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias _
    "RtlMoveMemory" (destination As Any, source As Any, _
    ByVal length As Long)
#Else
Public Declare Sub CopyMemory Lib "kernel32" Alias _
    "RtlMoveMemory" (destination As Any, source As Any, _
    ByVal length As Long)
    #End If

Private Declare Function UnmapViewOfFile Lib "kernel32.dll" ( _
     ByRef lpBaseAddress As Any) As Long

Private Declare Function CloseHandle Lib "kernel32.dll" ( _
     ByVal hObject As Long) As Long

Private hMMF As Long
Private pMemFile As Long

Sub IntoMemoryFileOutOfMemoryFile()

    Dim sFile As String
    Dim hFile As Long

    sFile = "Z:\path\test1.txt"

    hFile = CreateFile(sFile, GENERIC_READ Or GENERIC_WRITE, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)
    hMMF = CreateFileMapping(hFile, 0, PAGE_READWRITE, 0, 1000000, "MyMemoryMappedFile")

    pMemFile = MapViewOfFile(hMMF, FILE_MAP_WRITE, 0, 0, 0)

    Dim buffer As String

    buffer = "testing1"
    CopyMemory pMemFile, ByVal buffer, 128

    hMMF = CreateFileMapping(-1, 0, PAGE_READWRITE, 0, 1000000, "MyMemoryMappedFile")
    pMemFile = MapViewOfFile(hMMF, FILE_MAP_WRITE, 0, 0, 0)

     Dim buffer2 As String

    buffer2 = String$(128, vbNullChar)

     CopyMemory ByVal buffer2, pMemFile, 128

     MsgBox buffer2 & " < - it worked?"

     UnmapViewOfFile pMemFile
     CloseHandle hMMF
End Sub

Como un pequeño ejemplo, el código anterior intenta colocar la cadena "testing1" en el archivo test1.txt, luego recupera esa cadena y la almacena en la variable buffer2 y finalmente muestra esa cadena a través de un msgbox. Súper simple Sin embargo, no tengo idea de lo que estoy haciendo.

Todas nuestras PC son 64 bits, Windows 7, Office / Excel 2013.

Problemas / preguntas:

El msgbox está en blanco cuando ejecuto IntoMemoryFileOutOfMemoryFileUna vez que se completa el sub, abro el test1.txt y obtengo: "El proceso no puede acceder al archivo porque está siendo utilizado por otro proceso". Lo que me dice que no estoy usando UnmapViewOfFile y / o CloseHandle correctamente.Me gustaría hacer que estos archivos de memoria sean persistentes, de modo que si se interrumpen todas las PC, pueda reiniciar el proceso y continuar donde lo dejé.

Estos son algunos de los enlaces que solía tener donde estoy ahora:

https://msdn.microsoft.com/en-us/library/dd997372%28v=vs.110%29.aspx

http://www.vbforums.com/showthread.php?404085-VB6-Treat-a-file-like-an-array-without-reading-to-memory

http://vb.mvps.org/hardcore/html/sharedmemorythroughmemory-mappedfiles.htm

http://www.tushar-mehta.com/publish_train/xl_vba_cases/1016%20Office%202010%20VBA.shtml

Información interesante, pero sin importancia: el "proyecto" es para un cliente de fondos de cobertura. Soy un tipo de finanzas que se volvió fundamental. Estamos analizando más de 2000 acciones diariamente sobre más de 1250 campos de datos para hacer señales / predicciones macroeconómicas para comprar y vender acciones, futuros y opciones.

ACTUALIZACIÓN: si cambio las dos líneas de CopyMemory de esta manera (pasar pMemFile por valor) respectivamente:

CopyMemory ByVal pMemFile, buffer, 128

y...

CopyMemory buffer2, ByVal pMemFile, 128

Obtengo un montón de personajes locos en el archivo test1.txt y Excel se bloquea.

Respuestas a la pregunta(1)

Su respuesta a la pregunta