お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"共有メモリ(ストリーム)"





メモリマップトファイルを使った共有メモリストリームです。
2つのプロセスから同じ Name で Create するとメモリを共有できます。
Memory が共有メモリの先頭へのポインタです。
もちろんストリームとして使えますがサイズは固定です。

nifty:FDELPHI/MES/15/233 と同じですが、こちらは TCustomMemoryStreamから
派生させました。
#次の発言のメモリマップトファイルも参照してください。
--------------------------------------------------------------------------
unit Streams;

interface

uses Windows, SysUtils, Classes;

type

  EFMappingError = class(Exception);
  EFMCreateError = class(EFMappingError);
  EFMViewError = class(EFMappingError);

  TSharedMemoryStream = class(TCustomMemoryStream)
  private
    FHandle: THandle;
    FCreated: Boolean;
  public
    constructor Create(const Name: string; Size: Longint);
    destructor Destroy; override;
    function Write(const Buffer; Count: Longint): Longint; override;
    property Handle: THandle read FHandle;
    property Created: Boolean read FCreated;
  end;

implementation

uses Consts;

{ TSharedMemoryStream }

constructor TSharedMemoryStream.Create(const Name: string; Size: Longint);
var
  Address: Pointer;
begin
  FHandle := CreateFileMapping($FFFFFFFF, nil,
                  PAGE_READWRITE, 0, Size, PChar(Name));
  if FHandle = 0 then raise EFMCreateError.Create(
            'Could not open file-mapping object named "' + Name + '"');
  FCreated := (GetLastError = 0);
  Address := MapViewOfFile(FHandle, FILE_MAP_WRITE, 0, 0, 0);
  if Address = nil then
     raise EFMViewError.Create('Could not map view of file');
  inherited Create;
  SetPointer(Address, Size);
end;

destructor TSharedMemoryStream.Destroy;
begin
  inherited Destroy;
  if Memory <> nil then UnmapViewOfFile(Memory);
  if Handle <> 0 then CloseHandle(Handle);
end;

function TSharedMemoryStream.Write(const Buffer; Count: Longint): Longint;
var
  Pos: Longint;
begin
  if (Position >= 0) and (Count >= 0) then begin
    Pos := Position + Count;
    if Pos > 0 then begin
      if Pos > Size then begin
        Result := Size - Position;
        Pos := Size;
      end else begin
        Result := Count;
      end;
      System.Move(Buffer, Pointer(Longint(Memory) + Position)^, Result);
      Position := Pos;
      Exit;
    end;
  end;
  Result := 0;
end;

end.
--------------------------------------------------------------------------
                                                    ぜえた (QZC05100)

Original document by ぜえた          氏 ID:(QZC05100)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum