⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unitvirtualmemory.pas

📁 Delphi的另一款钢琴软件
💻 PAS
字号:
unit unitVirtualMemory;

interface

uses Windows, Classes, SysUtils;

type
TVirtualMemoryStream = class (TCustomMemoryStream)
private
  fReserved : Integer;
  fChunkSize : Integer;
protected
  procedure SetSize (NewSize : Integer); override;
public
  constructor Create (AReserved, AInitialSize : Integer);
  destructor Destroy; override;
  function Write(const Buffer; Count: Longint): Longint; override;
  property Reserved : Integer read fReserved;
  property ChunkSize : Integer read fChunkSize write fChunkSize;
end;

EVirtualMemory = class (Exception);

implementation

constructor TVirtualMemoryStream.Create (AReserved, AInitialSize : Integer);
begin
  fReserved := AReserved;
  fChunkSize := 1024;
  SetPointer (VirtualAlloc (Nil, AReserved, MEM_RESERVE, PAGE_READWRITE), AInitialSize);
  if AInitialSize > 0 then
    VirtualAlloc (Memory, AInitialSize, MEM_COMMIT, PAGE_READWRITE);
end;

destructor TVirtualMemoryStream.Destroy;
begin
  VirtualFree (Memory, 0, MEM_RELEASE);
  inherited;
end;

procedure TVirtualMemoryStream.SetSize (NewSize : Integer);
var
  oldSize : Integer;
  commitSize : Integer;
begin
  oldSize := Size;
  if NewSize <> oldSize then
    if NewSize <= Reserved then
    begin
      if NewSize > oldSize then          // Grow the buffer
      begin
        commitSize := NewSize - oldSize;
        if commitSize < ChunkSize then
          commitSize := ChunkSize;
        if commitSize + oldSize > Reserved then
           commitSize := Reserved - oldSize;
        NewSize := oldSize + commitSize;

        VirtualAlloc (PChar (memory) + oldSize, commitSize, MEM_COMMIT, PAGE_READWRITE)
      end
      else                           // Shrink the buffer (lop off the end)
        VirtualFree (PChar (Memory) + NewSize, oldSize - NewSize, MEM_DECOMMIT);
      SetPointer (Memory, NewSize);
    end
    else raise EVirtualMemory.Create ('Size exceeds capacity');
end;

function TVirtualMemoryStream.Write(const Buffer; Count: Longint): Longint;
var
  pos : Integer;
begin
  pos := Seek (0, soFromCurrent);
  if pos + count > Size then
    Size := pos + count;
  Move (buffer, PChar (Integer (memory) + pos)^, count);
  Seek (count, soFromCurrent);
  result := Count
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -