Einzelnen Beitrag anzeigen

Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

MemoryMappedFiles - Geht ja gar nicht

  Alt 1. Feb 2008, 17:04
Hey,

so langsam zweifele ich an meinen Fähigkeiten. Folgende Unit hatte ich mir gebastelt:

Delphi-Quellcode:
procedure WriteToMMF(Filename: PChar; Data: Pointer; Len: Int64);
var
  hFile: Cardinal;
  Mem: Pointer;
begin
  hFile := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, Len, Filename);
  if hFile <> 0 then
  begin
    try
      Mem := MapViewOfFile(hFile, FILE_MAP_WRITE, 0, 0, 0);
      if Assigned(Mem) then
      begin
        try
          CopyMemory(Mem, Data, Len);
        finally
          //UnmapViewOfFile(Mem);
        end;
      end;
    finally
      //CloseHandle(hFile);
    end;
  end;
end;

function ReadFromMMF(Filename: PChar; Len: Int64): Pointer;
var
  hFile: Cardinal;
begin
  hFile := CreateFileMapping($FFFFFFFF, nil, PAGE_READONLY, 0, Len, Filename);
  if hFile <> 0 then
  begin
    try
      Result := MapViewOfFile(hFile, FILE_MAP_READ, 0, 0, 0);
    finally
      //CloseHandle(hFile);
    end;
  end
    else
  begin
    Result := nil;
  end;
end;

procedure WriteMMFString(Filename: PChar; Value: String);
var
  Buf: Pointer;
  Len: Int64;
  hMem: Cardinal;
begin
  Len := Length(Value);
  hMem := GlobalAlloc(GPTR, Len + SizeOf(Int64));
  Buf := GlobalLock(hMem);
  try
    CopyMemory(Buf, @Len, SizeOf(Int64));
    CopyMemory(Pointer(Cardinal(Buf) + SizeOf(Int64)), @Value[1], Len);
    WriteToMMF(Filename, Buf, Len + SizeOf(Int64));
  finally
    GlobalUnlock(hMem);
    GlobalFree(hMem);
  end;
end;

function ReadMMFString(Filename: PChar; var Len: Int64): Pointer;
var
  Data: Pointer;
begin
  Result := nil;
  Data := ReadFromMMF(Filename, SizeOf(Int64));
  try
    if Assigned(Data) then
    begin
      Len := Cardinal(Data^);
      Data := ReadFromMMF(Filename, SizeOf(Int64) + Len);
      try
        if Assigned(Data) then
        begin
          Result := GlobalLock(GlobalAlloc(GPTR, Len));
          CopyMemory(Result, Pointer(Cardinal(Data) + SizeOf(Int64)), Len);
        end;
      finally
        //UnmapViewOfFile(Data);
      end;
    end;
  finally
    //UnmapViewOfFile(Data);
  end;
end;
Anwendung [1] schreibt nun mittels WriteMMFString mehrere String und mittels WriteToMMF einen Cardinal. Anwendung [2] ließt nun mittels ReadMMFString die Strings wieder aus und mittels ReadFromMMF den Cardinal. Das Problem ist folgendes: Mindestens einer der Werte wird nicht ausgelesen. Es wird allerhöchstens 00 zurückgegeben.
Irgendwie scheine ich das Prinzip aber auch noch nicht ganz verstanden zu haben. Die auskommentierten Befehle darf ich nicht aufrufen, weil sonst schonmal direkt überhauptnichts ankommt.

Das Problem ist auch, dass Anwendung [2] normalerweise permanent läuft. Gebe ich also die Mappings nicht wieder frei gibt es irgendwann Durcheinander bei den Daten die gelesen werden. Auch schreibt Anwendung [1] einen der Strings in einem festen Interval neu, da sich dieser auch laufend ändert.

Hat jemand eine Idee wie man das Problem lösen kann?

Gruß
  Mit Zitat antworten Zitat