Entwickler-Ecke

Dateizugriff - Verständnisproblem Speicher


Chris79 - Mi 18.06.08 17:20
Titel: Verständnisproblem Speicher
Hallo!

Ich habe mit folgendem Programm Probleme:


Delphi-Quelltext
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:
program packfile;

{$APPTYPE CONSOLE}

uses
  SysUtils,Windows,Classes;

const
    NEWFILE_SIZE = 300000;

procedure ReadFileIntoMemory(sFileName: PAnsiChar; const pMem: Pointer; dwOffset: DWord);
var
  dwBufSize: DWord;
  dwBytesRead: DWord;

  fs: TFileStream;
  fr: TReader;

  pBuf: array of Byte;
  pThis: Pointer;
begin
  dwBufSize := 64;
  SetLength(pBuf, dwBufsize);
  pThis := Pointer(DWord(pMem) + dwOffset);
  fs := TFileStream.Create(String(sFileName), fmOpenRead);
  fr := TReader.Create(fs, dwBufSize);
  if fs.Size <= Int64(dwBufSize) then
    fr.Read(pThis, fs.Size)
  else
    begin
      fr.Read(pBuf, dwBufSize);
      CopyMemory(pThis, @pBuf, dwBufSize);
      dwBytesRead := dwBufSize;
      while dwBytesRead < fs.Size do
        begin
          if dwBufSize >= (fs.Size - dwBytesRead) then
            dwBufSize := (fs.Size - dwBytesRead);
          pThis := Pointer(DWord(pThis) + dwBufSize);
          fr.Read(pBuf, dwBufSize);
          CopyMemory(pThis, @pBuf, dwBufSize);
          Inc(dwBytesRead, dwBufSize);
        end;
    end;
  fr.Free;
  fs.Free;
end;



var
  pMem: Pointer;
begin
    GetMem(pMem, NEWFILE_SIZE);
    ReadFileIntoMemory(PChar('test.exe'), pMem, 0);
    Writeln('1');
    //ReadFileIntoMemory('test1.exe', pMem, 100000);
    //ReadFileIntoMemory('test3.exe', pMem, 200000);
end.


Wenn die Prozedur beendet ist, tritt eine AccessViolation auf.
Disassembly zeigt: push dowrd ptr [ebp+$0c] (ebp+$0c ist 00000000)

Die Konstruktion mit pBuf hatte ich ursprünglich gar nicht, sondern hatte direkt pMem benutzt. Das mochte aber der TReader nicht und das Programm ist direkt bei fr.read abgestürzt.

Irgendwelche Ideen?

Gruß,

Christian

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Ich habe jetzt zumindest schon die Problemstelle identifiziert:

Wen ich pBuf als festes Array deklariere, dann funktioniert es.

Wie kann ich das Array denn dynamisch verwenden? SetLength 63,64,65 funktioniert alles nicht.



Außerdem kommen in dem Array unterschiedliche Werte an, ja nachdem, ob ich es fest deklariere (korrekte Werte) oder dynamisch (falsche Werte).


Sinspin - Mi 18.06.08 19:17

Verwende mal zum füllen von pBuf in fr.Read besser :

Delphi-Quelltext
1:
fr.Read(pBuf[0], dwBufSize);                    

Das könnte ein möglicher Fehler sein.

Und bei CopyMemory das gleiche :

Delphi-Quelltext
1:
CopyMemory(pThis, @pBuf[0], dwBufSize);