Access Violation na seguinte função

Delphi

11/07/2014

Estou com problema na seguinte função:

function MemoryStreamToString(M: TMemoryStream):string;
begin
  SetString(Result, PChar(M.Memory), M.size);
end;


Tirei esse código de um algoritmo de criptografia, a moral do código acima é passar como parâmetro um TMemoryStream e convertê-lo em string, o código original era:

function MemoryStreamToString(M: TMemoryStream):string;
begin
  SetString(Result, PChar(M.Memory), M.size div sizeof(char));   // a única diferença é o div sizeof(char)
end;


O problema do código original é que ele não converte todo o TMemoryStream, apenas a metade, tendo em vista que sizeof(char) é igual a 2, depois que eu reimplementei o código, aconteceu um problema de Acces Violation, ou seja, obviamente estou tentando acessar um ponto na memória que está inacessível, ou não está reservado para a respectiva variável, o código reimplementado compila normalmente, quando eu clico no botão de criptografia do programa ele dá a mensagem de Access Violation, eu clico em OK, ele fecha a caixa de mensagem, mas se eu clico novamente, ele roda normalmente e criptografa o arquivo sem dar erro, apesar de funcionar, eu não quero que o usuário veja essa mensagem toda vez que for criptografar um arquivo, como eu resolvo isso.
Agradeço desde já.
Andrew Vargas

Andrew Vargas

Curtidas 0

Melhor post

Thiago Irrazabal

Thiago Irrazabal

12/07/2014

Boa noite, veja se isso te ajuda.
if M.Size > 0 then
  begin
    SetLength(Result, M.Size);
    Move(M.Memory^, Result[1], M.Size);
  end;




Att,
Thiago Irrazabal de Oliveira.
GOSTEI 1

Mais Respostas

Andrew Vargas

Andrew Vargas

11/07/2014

Muito Obrigado Thiago Irrazabal, funcionou perfeitamente em todos os tipos de arquivos, com o algoritmo anterior ele funcionava com arquivos de extensão .txt, mas falhava no .exe, agora ele funciona com todos, valeu mesmo.
GOSTEI 0
POSTAR