|
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
|