Access Violation devido a um limite de escrita em um MapFile (Delphi)
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ó:
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.
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
Curtidas 0