名前付きパイプ
(注意)名前付きパイプはWindows NT以上(windows95,98,98SE,Meは不可)で使用できます。
「名前付きパイプ」は2つのプロセスの間で、プロセス間通信を行うときに使用します。名前付きパイプはネットワークで接続されたリモートコンピュータで実行されているプロセスとの間でも利用できます。ちなみに「名前なしパイプ」というのもありますが、こちらは親子プロセス間での通信に使用し、リモートコンピュータでは使用できません。
名前付きパイプは、「Delphi4 パワーガイド」でも説明がありますのでお持ちの方は参照してください。ここでは、「名前付きパイプ」が簡単に使えるクラスの例を示します。このクラスのコンストラクタは同じコンピュータ上で動作するプロセスのサーバー側のものです。クライアント側は、CreateNamedPipe関数でなくCreateFile関数を使用します。
(例)
hPipe := CreateFile('\\.\pipe\pipe1', GENERIC_READ or GENERIC_WRITE, FILE_SHARED_READ or FILE_SHARED_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
{ ***********************************************************************
名前つきパイプクラス
*********************************************************************** }
unit clsNamedPipe;
interface
uses
Windows, Classes, SysUtils;
const
OutBufferSize = 1024;
InBufferSize = 1024;
Timeout = 5000;
type
TNamedPipe = class(TObject)
private
FHandle: LongWord; // パイプハンドル
public
constructor Create(sName: string);
destructor Destroy; override;
function Read(var s: string): Integer; // パイプから読む
function Write(s: string): Boolean; // パイプに書く
end;
implementation
{ コンストラクタ }
constructor TNamedPipe.Create(sName: string);
begin
inherited Create;
FHandle := CreateNamedPipe(PChar('\\.\pipe\' + sName), PIPE_ACCESS_DUPLEX, 0, PIPE_UNLIMITED_INSTANCES,
OutBufferSize, InBufferSize, Timeout, nil);
end;
{ デストラクタ }
destructor TNamedPipe.Destroy;
begin
CloseHandle(FHandle);
end;
{ パイプから読む }
function TNamedPipe.Read(var s: string): Integer;
var
buffer: array[0..InBufferSize-1] of Char;
nBytesRead: LongWord;
begin
if FHandle = INVALID_HANDLE_VALUE then
begin
Result := -1;
Exit;
end;
ZeroMemory(@buffer[0], InBufferSize);
if ReadFile(FHandle, buffer, InBufferSize, nBytesRead, nil) = LongBool(false) then
begin
Result := -2;
Exit;
end;
Result := nBytesRead;
s := StrPas(buffer);
end;
{ パイプに書く }
function TNamedPipe.Write(s: string): Boolean;
var
buffer: array[0..OutBufferSize-1] of Char;
nBytesWrite: LongWord;
begin
if FHandle = INVALID_HANDLE_VALUE then
begin
Result := false; // NG
Exit;
end;
StrPCopy(buffer, s);
if WriteFile(FHandle, buffer, OutBufferSize, nBytesWrite, nil) = LongBool(false) then
begin
Result := false; // NG
Exit;
end;
Result := true; // OK
end;
end. |