Access Violation na seguinte função
Estou com problema na seguinte função:
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:
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á.
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
Curtidas 0
Melhor post
Thiago Irrazabal
12/07/2014
Boa noite, veja se isso te ajuda.
Att,
Thiago Irrazabal de Oliveira.
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
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