Como armazenar e obter dados dos arquivos de mapeamento de memória usando o CopyMemory no VBA?

Estou tentando criar um sistema de computação distributiva que usa arquivos de mapeamento de memória para coordenar o trabalho entre vários PCs em rede, todos via VBA. Em outras palavras, quero que um grupo de computadores em rede trabalhe ao mesmo tempo de maneira coordenada em um único projeto que pode ser facilmente dividido em partes diferentes. Um PC leva mais de 13 horas para concluir o projeto, o que não é prático para o meu cliente.

Desejo armazenar informações nos arquivos de mapeamento de memória que ajudarão os PCs a trabalhar no projeto de maneira coordenada (ou seja, sem duplicação de trabalho, evitar problemas de corrida, etc.). Tentei usar outros tipos de arquivos para fazer isso e isso causa problemas de corrida ou demora muito. Então, como sugerido neste fórum, estou tentando arquivos de mapeamento de memória.

Sou novato em arquivos de mapeamento de memória e computação distributiva. Tem que ser feito no VBA. Tanto quanto sei, tenho que especificar que o arquivo seja salvo em um diretório em nossa rede (unidade Z aqui) à qual todos os computadores têm acesso. Reuni alguns códigos de vários 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 um pequeno exemplo, o código acima tenta colocar a string "testing1" no arquivo test1.txt, em seguida, recupera-a e armazena-a na variável buffer2 e, finalmente, exibe-a por meio de uma msgbox. Super simples. No entanto, não tenho ideia do que estou fazendo.

Todos os nossos computadores são 64 bits, Windows 7, Office / Excel 2013.

Questões / perguntas:

A caixa de mensagens está em branco quando executo o IntoMemoryFileOutOfMemoryFileDepois que o sub é concluído, abro o test1.txt e recebo: "O processo não pode acessar o arquivo porque está sendo usado por outro processo." O que me diz que não estou usando UnmapViewOfFile e / ou CloseHandle corretamente.Gostaria de tornar esses arquivos de memória persistentes, para que, se todos os PCs forem interrompidos, eu possa reiniciar o processo e pegar de onde parei.

Aqui estão alguns dos links que eu costumava chegar onde estou agora:

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

Informações interessantes, mas sem importância: O "projeto" é para um cliente de fundo de hedge. Eu sou um sujeito financeiro que se tornou fundamental. Estamos analisando mais de 2000 ações, mais diariamente, em mais de 1250 + campos de dados para fazer sinais / previsões macroeconômicos para comprar e vender ações, futuros e opções.

UPDATE: Se eu alterar as duas linhas CopyMemory como esta (passe pMemFile por valor), respectivamente:

CopyMemory ByVal pMemFile, buffer, 128

e...

CopyMemory buffer2, ByVal pMemFile, 128

Recebo vários caracteres malucos no arquivo test1.txt e o Excel trava.

questionAnswers(1)

yourAnswerToTheQuestion