一个关于pipe联接的问题?为了不产生监时文件,我用CreateNamedPipe来代替临时文件,但在ConnectNamedPipe时总是通不过!
idrip 2005-07-22 03:28:15 一个关于pipe联接的问题?
为了不产生监时文件,我用CreateNamedPipe来代替临时文件,但在ConnectNamedPipe时总是通不过!
程序如下:
var
FileHandle, MapHandle: THandle;
FFilename, lpszPipename: string;
PIPE_TIMEOUT: Integer;
bfu: array of Byte;
uLen: DWORD;
Se: TSecurityAttributes;
stm: TMemoryStream;
begin
PIPE_TIMEOUT:= 1000;
FFilename:= 'c:\tmp.txt';
lpszPipename:= '\\.\pipe\Pipe_tmp';
FileHandle := FileOpen (FFilename, fmOpenRead + fmShareDenyNone);
if FileHandle = INVALID_HANDLE_VALUE then
raise Exception.Create ('Failed to open ' + FFilename);
BUFSIZE:= GetFileSize(FileHandle, nil);
SetLength(bfu, BUFSIZE);
FileRead(FileHandle, bfu[0], BUFSIZE);
FileClose(FileHandle);
Se.nLength:=Sizeof(TSecurityAttributes);
Se.lpSecurityDescriptor:=nil;
Se.bInheritHandle:=True;
MapHandle:= CreateNamedPipe(PChar(lpszPipename), // pipe name
PIPE_ACCESS_DUPLEX, // read/write access
PIPE_TYPE_MESSAGE or // message type pipe
PIPE_READMODE_MESSAGE or // message-read mode
PIPE_WAIT, // blocking mode
PIPE_UNLIMITED_INSTANCES, // max. instances
BUFSIZE, // output buffer size
BUFSIZE, // input buffer size
PIPE_TIMEOUT, // client time-out
@Se);
if MapHandle = -1 then
raise Exception.Create('Error!');
ConnectNamedPipe(MapHandle, nil); ////////////////////到这一步就执行不过去了,
///////////////////停在那里不动了!注释掉,后保存出
////////////////////的文件为0字节
uLen:= 0;
WriteFile(MapHandle, bfu[0], BUFSIZE, uLen, nil);
///////////////////////////////////////
//ShowMessage(IntToStr(uLen));
stm:= TMemoryStream.Create;
stm.LoadFromFile(lpszPipename);
stm.SaveToFile('c:\Result.txt');
stm.Free;
/////////////////////这一段只是为了看一文件对不对
DisconnectNamedPipe(MapHandle);
CloseHandle(MapHandle);
end;
///
哦,也有可能是我操作系统的原因.我用的win2003server,听说在win98下执行就不太正常.
我的最终目的也不是非用管道不可,只是为了不产生临时文件.如果有其它的办法,能像打开硬盘文件
一样在内存中打开文件就可以了!
我前好也用过CreateFileMapping,试用没有成功,如里大侠们有什么更好的方法也可以!
谢谢了!