Autor Beitrag
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Mo 17.03.08 22:50 
Ich habe eine Funktion, die eine Datei lesen soll
Das Öffnen ist das hier:
ausblenden volle Höhe 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:
function VAllocMem(Size: Integer): Pointer;
begin
  Result := VirtualAlloc(nil, Size, MEM_COMMIT, PAGE_READWRITE);
end;

procedure VFreeMem(var P);
begin
  VirtualFree(Pointer(P), 0, MEM_FREE);
end;

function PEFile.OpenPeFile(Filename: String):Boolean;
var
  aFile               : hFile;
  ofStruct            : _OFSTRUCT;
  BytesRead           : Cardinal;
begin
  result := FALSE;
  aFile := OpenFile(Pchar(Filename),ofStruct,OF_READ);
  if(GetLastError<>0then showmessage(SysErrorMessage(GetLastError));
  dwFileSize := GetFileSize(aFile,nil);
  If aFile <> 0 Then
    begin
      If ReadFile(aFile,DosHeader,SizeOf(DosHeader),BytesRead,nilThen
        begin
          If DosHeader.e_magic = IMAGE_DOS_SIGNATURE Then
            begin
              SetFilePointer(aFile, DosHeader._lfanew, nil, FILE_BEGIN);
              If ReadFile(aFile,NtHeader,SizeOf(NtHeader),BytesRead,nilThen
                begin
                  result := True;
                  FirstSection := DosHeader._lfanew + sizeof(IMAGE_NT_HEADERS);
                  SectionNum := NtHeader.FileHeader.NumberOfSections;
                  pmemory:=VAllocMem(dwFileSize); // fix later
                  SetFilePointer(aFile, 0nil, FILE_BEGIN);
                  ReadFile(aFile,pmemory^,dwFileSize,BytesRead,nil);
                  Copymemory(@SectionHeaders,Pointer(Integer(pmemory)+FirstSection),SectionNum*SizeOf(_IMAGE_SECTION_HEADER));
                end;
            end;
        end;
    end;
    CloseHandle(aFile);
end;


den Speicher geb ich eigendlich über
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure PEFile.FreeMemory;
begin
  VFreeMem(pmemory);
end;

wieder frei
trotzdem belegt mein Programm, welches das aufruft noch den vollen speicher (Größe der EXE-Datei die ich öffne)
warum das? Hab ich eine Stelle übersehen?


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mo 17.03.2008 um 21:52
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Di 18.03.08 10:56 
Hallo,

der richtige Parameter für VirtualFree ist MEM_RELEASE, nicht MEM_FREE.

Gruß, Motzi

PS: in welcher Farbe hast du deinen Speicher denn lackiert? :mrgreen: Sorry, aber ich find diesen Tippfehler einfach zu geil! ;)

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Flamefire Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Di 18.03.08 19:33 
ok danke
^^