Access Violation devido a um limite de escrita em um MapFile (Delphi)

Delphi

09/12/2016

Ola a todos os amigos da DevMedia, infelizmente estou com um daqueles probleminhas chatos...
Utilizo a técnologia de mapfile do windows para fazer a comunicação entre os sistemas da empresa onde trabalho, transmitindo um texto JSON com diversos dados que consideramos relevantes... Isto realmente funcionou muito bem até hoje, mas com o passar do tempo fomos colocando informação demais na transmissão, e descobrimos que quando o JSON passa de 2048 caracteres a integração para de funcionar, dando um erro de Access Violation!
Utilizo os métodos CreateFileMapping, OpenFileMapping e MapViewOfFile para trabalhar com o mapfile, veja só:

procedure TTeste.MapFile();
var
  sJsonInformacoes: string;
  wsMapFile: WideString;
  pMapFileText: PWideChar;
  hMapFile: HWND;
begin
  wsMapFile := 'testemapfile';
  hMapFile := CreateFileMappingW($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(PWideChar), PWideChar(wsMapFile));
  if hMapFile > 0 then
  begin
    // Se o MapFile ja existe, deve-se carregá-lo em vez de criar.
    if GetLastError = ERROR_ALREADY_EXISTS then
      hMapFile := OpenFileMappingW(FILE_MAP_ALL_ACCESS, False, PWideChar(wsMapFile));

    // Atribui valores ao MapFile
    if hMapFile <> 0 then
    begin
      sJsonInformacoes := MontarJsonInformacoes(); //Retorna uma string contendo o JSON
      pMapFileText := MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(PWideChar)); // Carrega o ponteiro
      if Assigned(pMapFileText) then
        StringToWideChar(sJsonInformacoes, pMapFileText, Length(sJsonInformacoes) + 1) // Grava o texto Json no ponteiro
      else
        RaiseLastOSError;
    end
    else
      RaiseLastOSError;
  end
  else
    RaiseLastOSError;
end;


O sistema que compilamos por aqui é em arquitetura 32-bits, e imagino que o limite de 4kb de texto (2048 caracteres em WideString) tenha alguma relação com isso.
Alguém sabe me explicar o que esta acontecendo? Ou sabe uma outra estratégia que posso utilizar para transmitir este JSON entre os sistemas?

Abraço.
Ismael Machado

Ismael Machado

Curtidas 0
POSTAR