AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi MemoryMappedFiles - Geht ja gar nicht

MemoryMappedFiles - Geht ja gar nicht

Ein Thema von Zacherl · begonnen am 1. Feb 2008 · letzter Beitrag vom 9. Feb 2008
 
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, 16: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
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz