GARANTIR DESCONTO

Fórum Access Violation devido a um limite de escrita em um MapFile (Delphi) #572455

09/12/2016

0

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

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar