Salut à tous, j'ai un petit probleme, voici comment ca se présente:
Un ami m'a donné un code exemplatif pour la compression zlib, il utilise les streams:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, zlib, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure Decompresser(path : String);
var
 InpBuf, OutBuf: Pointer;
 OutBytes, sz: Integer;
 outStream,inpStream: TMemoryStream;
begin
 InpBuf := nil;
 OutBuf := nil;
 InpStream := TMemoryStream.Create;
 InpStream.LoadFromFile(path);
 inpstream.Read(sz,sizeof(integer));
 outStream := TMemoryStream.Create;
 if sz > 0 then
  try
   GetMem(InpBuf, sz);
   inpStream.Read(InpBuf^, sz);
   DecompressBuf(InpBuf, sz, 0, OutBuf, OutBytes);
   outStream.Write(OutBuf^, OutBytes);
   OutStream.Seek(SoFromBeginning,0);
   InpStream.Size := 0;
   inpStream.CopyFrom(OutStream,OutStream.Size);
   InpStream.Seek(SoFromBeginning,0);
   OutStream.SaveToFile(path);
  finally
   if InpBuf <> nil then FreeMem(InpBuf);
   if OutBuf <> nil then FreeMem(OutBuf);
   OutStream.Free;
  end;
end;
 
 
Procedure Compresser(path : String);
var
 InpBuf, OutBuf: Pointer;
 InpBytes, OutBytes: Integer;
 outStream,inpStream: TMemoryStream;
begin
 InpBuf := nil;
 OutBuf := nil;
 InpStream := TMemoryStream.Create;
 InpStream.LoadFromFile(path);
 outStream := TMemoryStream.Create;
 try
  GetMem(InpBuf, inpStream.Size);
  inpStream.Position := 0;
  InpBytes := inpStream.Read(InpBuf^, inpStream.Size);
  CompressBuf(InpBuf, InpBytes, OutBuf, OutBytes);
  outstream.Write(Outbytes,sizeof(integer));
  outStream.Write(OutBuf^, OutBytes);
  OutStream.Seek(SoFromBeginning,0);
  InpStream.Size := 0;
  inpStream.CopyFrom(OutStream,OutStream.Size);
  InpStream.Seek(SoFromBeginning,0);
  OutStream.SaveToFile(path);
 finally
  if InpBuf <> nil then FreeMem(InpBuf);
  if OutBuf <> nil then FreeMem(OutBuf);
  OutStream.Free;
 end;
end;

Pour ma part, j'ai un programme de cryptage d'executable, et j'aimerais y integrer cette fonction de compression pour rendre le exe plus petit. Le probleme c'est que j'utilise non pas des streams mais des strings:
Déclaration des vars:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
var
  resultat: boolean;
  InputName, OutputName, IString, OString, InSize, SizeOfImg, Tmp, SI, SO: string;
  RHandle, RSize, Input, Output, Bytes, eofsize, b: dword;
  i, x, y, BI, BO: integer;
  RPoint: pchar;
  RLoc: HRSRC;
  e, PI, PO: pointer;
  fOutput: TFileStream;
  SectionTable: TSectionTable;
Morceau de code:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[...]
          Input := CreateFile(pchar(InputName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
[...]
          i := GetFileSize(InputName);
          Setlength(IString, i);
          ReadFile(Input, IString[1], i, Bytes, nil);
 
          BI := i;
          SI := IString;
          PI := pchar(SI);
          CompressBuf(PI, BI, PO, BO);
          Setlength(SO, BO);
          SO := pchar(PO);
[...]
Je pense que ceci est erroné, quand j'utilise le code de mon amis, calc.exe, une fois compressé, tourne dans les 50Ko. Ici, mon string SO contenant calc fait 3Ko ... probleme ... (pourtant, si je fais un ShowMessage(IntToStr(BO)); j'ai bien les 50Ko)
Je pense que c'est mon utilisation des strings et pointeurs qui est en cause, je fais sans doute qqch de travers, mais quoi ? (le SO := pchar(PO); ???) Je ne suis pas encore très familiarisé avec les pointeurs donc si qq1 pouvait m'aiguiller...

Merci d'avance

PS:
j'ai essayé:
SO := pchar(PO^); >> Access violation
SO := String(PO); >> Access violation