Fórum Access Violation na seguinte função #485312

11/07/2014

0

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

Responder

Post mais votado

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.

Thiago Irrazabal

Thiago Irrazabal
Responder

Gostei + 1

Mais Posts

12/07/2014

Andrew Vargas

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.
Responder

Gostei + 0

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

Aceitar