AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: Windows API / MS.NET Framework API Delphi Kleines Beispiel zu Memory Mapped Files (MMF)
Thema durchsuchen
Ansicht
Themen-Optionen

Kleines Beispiel zu Memory Mapped Files (MMF)

Ein Thema von Luckie · begonnen am 30. Jan 2003
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Kleines Beispiel zu Memory Mapped Files (MMF)

  Alt 30. Jan 2003, 10:21
Delphi-Quellcode:
uses windows,sysutils;

type
  TcsMMFDemo = class(TObject)
  private
    FdwReadSize : DWORD;
    FdwPosition : DWORD;
    FszBuffer : PChar;
    FdwFileSize : DWORD;
    procedure SetPosition(const Value: DWORD);
  public
    constructor Create(const p_sFilePath : string);
    destructor Destroy; override;
    function ReadMMF(const p_dwSize: DWORD;var p_dwBytesRead : DWORD) : string;
    property Position : DWORD read FdwPosition write SetPosition;
    property Size : DWORD read FdwFileSize;
  end;

implementation

{ TcsMMFDemo } 

constructor TcsMMFDemo.Create(const p_sFilePath: string);

var
  aSA : TSecurityAttributes;
  dwSize : DWORD;
  hFile : DWORD;
  hMMF : DWORD;

begin
  inherited Create;
  aSA.nLength := SizeOf(TSecurityAttributes);
  aSA.bInheritHandle := true;
  aSA.lpSecurityDescriptor := nil;
  hFile := CreateFile(PChar(p_sFilePath),GENERIC_READ,FILE_SHARE_READ,@aSA,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
  try
    if hFile = INVALID_HANDLE_VALUE then
    begin
      raise Exception.CreateFmt('Datei %s konnte nicht geöffnet werden',[p_sFilePath]);
    end;
    FdwFileSize := GetFileSize(hFile,nil);
    hMMF := CreateFileMapping(hFile,@aSA,PAGE_READONLY or SEC_COMMIT,0,FdwFileSize,nil);
    if hMMF = 0 then
    begin
      raise Exception.Create('File Mapping fehlgeschlagen');
    end;
  finally
    CloseHandle(hFile);
  end;
  FdwPosition := 0;
  FszBuffer := MapViewOfFile(hMMF,FILE_MAP_READ,0,0,FdwFileSize);
  try
    if FszBuffer = nil then
    begin
      raise Exception.Create('View Mapping fehlgeschlagen');
    end;
  finally
    CloseHandle(hMMF);
  end;
end;

destructor TcsMMFDemo.Destroy;
begin
  UnmapViewOfFile(FszBuffer);
  inherited Destroy;
end;

procedure TcsMMFDemo.SetPosition(const Value: DWORD);
begin
  if Value < FdwFileSize then
  begin
    FdwPosition := Value;
  end
  else
  begin
    FdwPosition := FdwFileSize-1;
  end;
end;

function TcsMMFDemo.ReadMMF(const p_dwSize: DWORD;var p_dwBytesRead : DWORD) : string;

begin
  Result := '';
  if p_dwSize = 0 then
  begin
    exit;
  end;
  FdwReadSize := p_dwSize;
  if (FdwPosition + FdwReadSize) > FdwFileSize then
  begin
    FdwReadSize := FdwFileSize - FdwPosition;
  end;
  p_dwBytesRead := FdwReadSize;
  Result := StringOfChar(#00,FdwReadSize);
  StrLCopy(@Result[1],(FszBuffer+FdwPosition),FdwReadSize);
  FdwPosition := FdwPosition + FdwReadSize;
end;

end.
Autor: Christian Seehase
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort

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 11:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz